将某人的当地时间转换为 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 时间的主要内容,如果未能解决你的问题,请参考以下文章

JSON.NET 将 +00:00 时区解析为当地时间,但 Z 解析为 UTC

我从当地时间到 UTC 的转换有啥问题

UTC 到夏令时的当地时间

python utc和当地时间之间的日期时间转换

Js 怎么把UTC时间到转换到当地时间

在 C/C++ 中在当地时间和 GMT/UTC 之间转换