You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:12