【问题标题】:How to change UTC timezone and get actual time?如何更改 UTC 时区并获取实际时间?
【发布时间】:2016-01-12 02:48:01
【问题描述】:

我想要实现的是,通过使用 int 值,更改 UTC 日期时间并从不同时区接收时间。

int 值应该是:

0 = UTC+00:00
1 = UTC+01:00
...

按照逻辑,它应该是这样的:

int timezoneInt = 1;
var newDate = DateTime.UtcNow.AddMinutes(timezoneInt*60);

但问题是这不包括夏季/冬季时间。

例如:

我的位置是 UTC+02:00,时间是 09:20 AM。我需要获取 UTC+00:00(等于 DateTime.UtcNow 并且 应该是(?) 07:20 AM)。因为夏令时,现在.UtcNow 是早上 06:20,所以我不能只将 60 分钟乘以 int 值,我还需要以某种方式包含夏令时因素。

我应该如何做到这一点,或者我缺少什么或了解谁?

编辑: 被标记为重复。好吧,here 我没有看到任何可以通过使用 int 值作为时区来帮助改变时间的东西。

【问题讨论】:

  • 使用TimeZoneInfo。可以通过DateTime.UtcNow.AddHours(1) 添加小时。像你一样加 60m 是没有意义的
  • 马克,你没看第一题吧?
  • @OlegsJasjko 我严重误解了这个问题 - 但问题,即来自 kevinintjuh93 链接的答案似乎是你的答案
  • 不,不是。我添加了评论原因。

标签: c# datetime timezone utc


【解决方案1】:

调整夏令时需要一个广泛的时区数据库,该数据库还记录该时区更改为夏令时的日期和时间,以及新的 UTC 偏移量是多少。

DST 数据库不容易构建(在某些情况下甚至无法使用),必须手动研究和维护,因为它们是政治性的,而不是技术性的 - 各国可以根据需要更改夏令时,因此数据库也需要记录历史日期。

.NET Framework 有一个内置的 TimeZoneInfo 类(它已废弃 TimeZone 类),它利用 Windows 或任何主机操作系统内置的时区数据库。 Windows 的时区数据库使用全名来标识区域,而 Linux 和 tzdb 使用像 America/New_York 这样的 ID。

请注意,通常您永远不应该自己执行这些计算,因为总是有许多边缘情况需要注意。只需使用DateTimeOffset

此外,没有 UTC 偏移量和时区之间的 1:1 映射:不同的时区共享相同的 UTC 偏移量但具有不同的夏令时规则(例如,英国时区使用 UTC+0 作为他们正常的 UTC 偏移量,但夏季为 UTC+1,但如果您看到“UTC+1”,它可能是夏季的英国时区或西非时区,例如阿尔及利亚的 UTC+1,但不使用夏令时完全没有。

【讨论】:

  • 据我了解,这需要我将 timezore id 存储为字符串值,这是我想要运行的东西。
  • @OlegsJasjko - 正如我们试图向您解释的那样 - 您的请求无效,因为时区不是这样工作的。
  • 好吧,那真是太可惜了... :(
【解决方案2】:

the timezone tag wiki逐字复制:

时区 != 偏移量

时区不能仅由与 UTC 的偏移量来表示。由于daylight saving time(又名“夏令时”)规则,许多时区有不止一个偏移量。偏移量更改的日期也是时区规则的一部分,任何历史偏移量更改也是如此。许多软件程序、库和 Web 服务忽略了这一重要细节,并错误地将标准或当前偏移量称为“区域”。这可能会导致混乱和滥用数据。请尽可能使用正确的术语。

  • 偏移量只是一个数字,表示特定日期/时间值领先或落后于 UTC 多远。
    • 大多数偏移量以整小时表示。
    • 但是有很多是 30 分钟的偏移量。
    • 还有几个是 45 分钟的偏移量。
  • 时区包含更多内容:
    • 可用于识别区域的名称或 ID。
    • 与 UTC 的一个或多个偏移量
    • 区域在偏移之间转换的具体日期和时间。
    • 有时,可以向用户显示单独的特定于语言的显示名称。

在给定时区和日期时间的情况下,可以确定正确的偏移量。但是一个不能只给一个偏移量就确定正确的时区。

您在问如何忽略这一事实并使其正常工作 - 这是不可能的。您不能使用整数偏移量并期望它能够理解夏令时。任何试图打破这一点的解决方案都将偏向于一组特定的夏令时规则,这些规则因国家/地区而异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2014-04-15
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2010-09-27
    相关资源
    最近更新 更多