【问题标题】:Issue on converting time from local to UTC at DST end date while using TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) method使用 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法时在 DST 结束日期将时间从本地转换为 UTC 的问题
【发布时间】:2015-09-03 17:47:50
【问题描述】:

我有一个将本地时间转换为 UTC 并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟回到凌晨 1 点到凌晨 2 点))。

我的本​​地系统时区是 (UTC-08:00) 太平洋时间(美国和加拿大) 我将时间 2015-10-31 01:49:00.000 转换为 UTC,输出为 2015-10-31 08:49:00.000。

但是

当我尝试将 2015-11-01 01:49:00.000 转换为 UTC 时,输出为 2015-10-31 09:49:00.000。

这不是错的吗?为什么转换后的时间在 11 月 1 日增加了一个小时?

这是我的方法,

DateTime universalFormatDateTime = localDateTime.Value.GetUniversalFormatDateTime();
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(universalFormatDateTime, _timeZoneInfo);

【问题讨论】:

  • “通用格式日期时间”首先是什么意思?这听起来就像它实际上是在UTC,但显然不是......你可能想要重命名你的变量和方法以避免混淆。

标签: c# .net datetime timezone


【解决方案1】:

这不是错的吗?为什么转换后的时间在 11 月 1 日增加了一个小时?

正如你所说,因为那是时钟改变的时候。

问题在于“2015-11-01 01:49:00.000”在太平洋时间不明确 - 它出现两次,一次在 2015-11-01T08:49:00Z 和一次在 2015-11-01T09:49 :00Z。

DateTimecan remember which of those you mean,但这取决于您如何得出该值。如果您只是从某个地方的文本中解析出来的,那么您基本上没有足够的信息 - 它没有指定单个时刻。

如果您要改用我的 Noda Time 库,那么当从 LocalDateTime 转换为 ZonedDateTime 时,您将能够指定您希望如何处理歧义 - 这样 可能 是您的一个选择...但这取决于值的来源,以及您是否知道它是 always 第二次出现还是 always 第一次出现。

如果您仍想使用TimeZoneInfo,您可以使用TimeZoneInfo.IsAmbiguousTimeTimeZoneInfo.IsInvalidTime 来检测由于时区变化而出现两次或零次的本地时间,然后在您的应用中进行适当的处​​理。

【讨论】:

  • 时间是从日期选择器控件中解析出来的
  • @user1890098:那么你怎么知道用户是指第一次 01:49还是第二次?
  • @user1890098 - 考虑使用TimeZoneInfo 类的IsAmbiguousTimeIsInvalidTime 方法测试用户输入。无效时间应该无法通过验证,而模糊时间可以通过应用程序逻辑来区分,或者通过提示用户选择他们想要的时间来区分。
  • @MattJohnson:在答案中添加了对那些人的引用 - 谢谢。
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 2015-04-20
  • 2012-10-07
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2017-03-10
  • 2019-03-30
相关资源
最近更新 更多