将某人的当地时间转换为 UTC 时间
Posted
技术标签:
【中文标题】将某人的当地时间转换为 UTC 时间【英文标题】:Convert somebody's local time to the UTC time 【发布时间】:2011-03-25 15:58:44 【问题描述】:我有点迷失在时区:)
我的数据以 UTC 时间存储。 服务器在荷兰,所以我们住在 utc+1(现在,夏令时,在 utc+2)
现在一个客户说:给我 8 月 5 日的数据。
所以我必须从“他的时间”计算UTC时间。 为此我必须知道:
你的 utc 偏移量是多少(我们将其存储在他的个人资料中,比如说 utc -6) 你在夏令时吗(因为我们必须添加 +1 并使 utc 偏移量 -5)
然后我的问题:
请问.Net框架:XX国有夏令时吗?
请问.Net 框架:那个时候XXX 夏令时是08-05-2010T00:00:00 吗?
我一直在尝试 .ToLocalTime(),但这只是给了我服务器上的本地时间,这不是我想要的,我想用用户的时区来计算,而且事实上在那个特定的时间点,如果他/她正处于夏令时
我也看过这个 VB 例子:
TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeToUtc(TempDate, TimeZone)
但恕我直言,这并没有考虑到该时区的用户是否在夏令时 (dst) 国家/地区。 例如,这个时区的一个用户在荷兰有 dst,而另一个用户在另一个没有 dst 的国家。
【问题讨论】:
相关问题 - ***.com/questions/2532729/… 【参考方案1】:您不能向框架询问特定的国家 - 但您可以询问特定的时区。
TimeZoneInfo
确实考虑了夏令时。 (哎呀,否则它不会有 IsDaylightSavingTime
方法。)如果您有两个用户,其中一个当前正在观察 DST 而另一个没有,那么他们不是 em> 在同一时区。
如果您可以指定您所谈论的位置,我可以尝试找出所涉及的时区。 (查找 Olson 名称通常更容易,但查找 Windows ID 应该不是不可能的。)
【讨论】:
好的,谢谢。但是你是说用户在进入夏令时时必须改变他们的时区吗?例如,通常我在 GMT+1 阿姆斯特丹,但随后输入了 DST,那么我是在 GMT+2 吗?还是我在 DST 的 GMT + 1 中?如果是前一种情况,用户必须在我的应用程序中更改他的时区。 (在这种情况下,它会像你说的那样工作,因为居住在 DST 国家/地区的用户确实将他的时区更改为 +2,而居住在非 DST 国家/地区的用户将他的时区保持在 +1) @Michel:不,时区描述了它何时进入和退出 DST。例如,我在 Olson 名称为“Europe/London”的时区 - 半年是 UTC,半年是 UTC+1。您在 DST 国家/地区的用户不会更改时区 - 他们的时区更改偏离 UTC。这是一个非常重要的区别。 @Jon:好的,不知道 TimeZone 知道 DST 何时开始结束。但是:那么还必须知道你住在哪里,因为如果你的时区现在在 DST 中,我可以检查时区,但我还必须知道你的国家(因为你的时区中有多个国家)是否适用于 DST ? @Jon:还有一个问题,就是把DST改成正常时间,02.15倍数。所以当你说:它发生在我家 02.15 时,我不得不问你:“是第一个 02.15 还是第二个 02.15”,以确定正确的 UTC 时间。 @Petar:美国有几个时区,而不仅仅是一个。是的,同一经度可以有不同的时区。【参考方案2】:TimeZone 类有一个方法 IsDaylightSavingTime,它以日期为参数 并返回一个布尔值,指示该日期是否在该时区的夏令时。
【讨论】:
谢谢,但这仅适用于当地时间,在我的情况下,在 asp.net 服务器应用程序中,这将是服务器所在位置的时间。在这种情况下,我可以检查服务器是否在 dst,但如果用户在特定时区,则不能。【参考方案3】:我将我的评论推广为答案。 这似乎是一个复杂的问题。看http://www.timeanddate.com/time/dst2010.html,世界各国都有一张夏令时表。您无法使用静态代码获得此信息,因为 DST 不仅因国家而异,而且每年都在变化。
我猜你必须维护一个包含 DST 信息的表并从中获取信息。
或者您可以查询网络服务以获取此类信息。
查看http://www.earthtools.org/webservices.htm#timezone 的网络服务,您可以查询该服务以获取考虑 DST 的各个国家/地区的时间(它仅适用于西欧时区)。 另请查看http://www.geonames.org/export/web-services.html。您必须获取用户的地理位置才能使用这些服务。
【讨论】:
我发现了这个:'timeZone.GetAdjustmentRules()[0].DaylightTransitionStart' 告诉我 dst 何时在特定区域开始,是一样的吗? 我在 MSDN 中查找。大致相同,但根据timeanddate.com/time/dst2010.html DST 上的信息,信息是动态的,会根据国家法律的修改而随时间变化,因此不能“嵌入”在静态框架中。无论如何,我想法律的修改不会经常发生,所以如果你不担心偶尔计算错误,你可以选择 DaylightTransitionStart以上是关于将某人的当地时间转换为 UTC 时间的主要内容,如果未能解决你的问题,请参考以下文章