【问题标题】:Change many time zones time更改多个时区时间
【发布时间】:2020-06-19 07:03:06
【问题描述】:

我正在开发一个 ASP.net Web 应用程序,它托管在 Windows 服务器中。我想用不同的用户时区测试 DST 回退模糊小时(2020 年 11 月 1 日上午 1 点 15 分)的一些功能。服务器时区是东部 (EST/EDT) 我可以改变它。但用户可以选择他们的时区。如果我将东部时区更改为 2020 年 11 月 1 日上午 1 点 15 分,则其他时区未根据用户看到的当前时间而不是时间进行调整。有没有办法手动设置其他时区时间。

【问题讨论】:

  • 服务器版本甚至操作系统都无关紧要。对于初学者,不要使用DateTime,至少使用 DateTimeOffset。 DateTime 类型仅支持 2.5 种值 - UTC、Local 和 Unspecified。 Local 表示执行帐户使用的任何时区,未指定表示您不知道偏移量是多少。
  • 日期本地化是一个复杂的话题,没有完美的解决方案。在我的情况下,我更喜欢让我的系统在 UTC 日期运行,然后当它与用户交互时,我转换到/从用户的时区。
  • 也不要只存储 UTC,除非您还单独存储实际时区。正如 Jon Skeet 所写的UTC is not a silver bullet。例如,UTC 对 DST 只字未提,这意味着您不能真正使用 UTC 时间,除非您知道使用了哪些偏移量 DST 规则
  • 最好的解决方案是存储 IANA 时区名称(例如Europe\Berlin)。 IANA 时区数据库 (tzdb) 是事实上的时区标准,包含可追溯到 1900 年代的所有时区的偏移量和 DST 规则。这就是为什么这么多论坛询问用户他们的时区名称,而不是他们的偏移量。您可能也应该使用 NodaTime 来处理时区和转换。
  • “如果我将东部时区更改为 2020-11-1 01.15”-> 我迷失在这句话中。将“时区”更改为“日期时间”对我来说没有意义。时间是一样的,时间的表现方式在变化。

标签: c# asp.net windows windows-server-2012


【解决方案1】:

下面的例子可以帮助你。

DateTime dt = DateTime.Now.ToUniversalTime();
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
DateTime date = TimeZoneInfo.ConvertTimeFromUtc(dt, timeZone);

您可以在此处找到时区列表

https://stackoverflow.com/a/7908482/6527049

【讨论】:

  • 并非如此。该时区名称来自哪里?它必须存储在某个地方。 Windows 时区也有问题,特别是对于较旧的日期有几个差距。它们也依赖于操作系统更新。每个真正关心 timeones 的人都直接或通过库使用 IANA tzdb,例如 NodaTime
  • 我也强烈建议避免使用DateTime.Now。表达式DateTime.Now.ToUniversalTime() 有效地执行“采用系统时间 (UTC),将其转换为本地时间,然后将其转换回 UTC”。它比DateTime.UtcNow 效率低得多(也更难阅读)。
  • 至于非标准,取IST——什么意思?这绝对不是您刚才所想的不是 - 实际上有 3 个不同的时区与这些首字母。爱尔兰标准时间、以色列标准时间、印度标准时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2020-05-06
  • 1970-01-01
  • 2011-02-21
  • 2015-04-20
  • 2012-02-08
相关资源
最近更新 更多