C# TimeZoneInfo.ConvertTime时区转换结果异常问题咨询
问题原因分析
你的问题主要来自两个关键误解:
1. 时区ID对应的实际时区并非你预期的WET
你使用的"W. Europe Standard Time"这个Windows时区ID,并不是西欧时间(WET,UTC±0),而是对应中欧时区(CET/CEST)——覆盖巴黎、柏林、马德里等城市,标准时为UTC+1,夏令时为UTC+2。
而真正的西欧时间(WET/WEST,比如葡萄牙地区)对应的Windows时区ID是"GMT Standard Time"(和英国时区规则一致,标准时UTC±0,夏令时UTC+1)。
2. 夏令时时段的偏移计算错误
2018年6-7月属于夏令时生效时段:
- 美国东部时区(
"Eastern Standard Time")此时实行东部夏令时(EDT),偏移为UTC-4(而非标准时EST的UTC-5) - 中欧时区(
"W. Europe Standard Time")此时实行中欧夏令时(CEST),偏移为UTC+2(而非标准时CET的UTC+1)
验证计算:
美国东部时区的13:00(EDT)转换为UTC时间:13:00 + 4小时 = 17:00 UTC
再转换为中欧夏令时(CEST):17:00 UTC + 2小时 = 19:00
这和你代码运行得到的结果完全一致。
如何修正?
如果你确实需要转换到西欧时间(WET/WEST),只需把目标时区ID改为"GMT Standard Time":
var str = "2018-07-09T13:00:00"; var dt = Convert.ToDateTime(str); var SourceZoneValue = "Eastern Standard Time"; // 改为对应WET/WEST的时区ID var DestinationZoneValue = "GMT Standard Time"; TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(SourceZoneValue); TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById(DestinationZoneValue); DateTime localTime = TimeZoneInfo.ConvertTime(dt, sourceTimeZone, destinationTimeZone); Console.WriteLine(localTime); // 输出 2018-07-09 18:00:00
另外,建议在处理时间转换时尽量使用DateTimeOffset或者带时区信息的类型,能有效避免时区歧义问题。
内容的提问来源于stack exchange,提问作者Joe Lu
相关产品推荐
相关产品推荐

