使用 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法时在 DST 结束日期将时间从本地时间转换为 UTC 的问题
Issue on converting time from local to UTC at DST end date while using TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) method
我有一个将本地时间转换为 UTC 并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟在到达凌晨 2 点时回到凌晨 1 点))。
我的本地系统时区是 (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);
Isn't this wrong? why did the converted time increase by an hour on 1st November?
因为那是时钟改变的时候,正如你所说。
问题是“2015-11-01 01:49:00.000”在太平洋时间不明确 - 它出现了两次,一次在 2015-11-01T08:49:00Z,一次在 2015-11 -01T09:49:00Z.
A DateTime
can remember which of those you mean,但这取决于您是如何得出该值的。如果您刚刚从某处的文本中解析了它,那么您基本上没有足够的信息 - 它没有指定一个时间点。
如果您改为使用我的 Noda Time 库,那么在从 LocalDateTime
转换为 ZonedDateTime
时,您可以指定希望如何处理歧义 - 所以可能是你的一个选择...但这取决于价值来自哪里,以及你是否知道它是总是第二个第一次出现或总是。
如果您仍想使用 TimeZoneInfo
,您可以使用 TimeZoneInfo.IsAmbiguousTime
and TimeZoneInfo.IsInvalidTime
来检测因时区转换而出现两次或零次的当地时间,然后在您的应用中适当地处理这些时间。
我有一个将本地时间转换为 UTC 并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟在到达凌晨 2 点时回到凌晨 1 点))。
我的本地系统时区是 (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);
Isn't this wrong? why did the converted time increase by an hour on 1st November?
因为那是时钟改变的时候,正如你所说。
问题是“2015-11-01 01:49:00.000”在太平洋时间不明确 - 它出现了两次,一次在 2015-11-01T08:49:00Z,一次在 2015-11 -01T09:49:00Z.
A DateTime
can remember which of those you mean,但这取决于您是如何得出该值的。如果您刚刚从某处的文本中解析了它,那么您基本上没有足够的信息 - 它没有指定一个时间点。
如果您改为使用我的 Noda Time 库,那么在从 LocalDateTime
转换为 ZonedDateTime
时,您可以指定希望如何处理歧义 - 所以可能是你的一个选择...但这取决于价值来自哪里,以及你是否知道它是总是第二个第一次出现或总是。
如果您仍想使用 TimeZoneInfo
,您可以使用 TimeZoneInfo.IsAmbiguousTime
and TimeZoneInfo.IsInvalidTime
来检测因时区转换而出现两次或零次的当地时间,然后在您的应用中适当地处理这些时间。