在.NET时区转换中如何指定源DateTime的时区?
解决C#时区转换中指定源时区的问题
你当前代码的问题在于,Convert.ToDateTime("2023-09-05T08:00:00") 会将无时区信息的字符串解析为**本地时区(你的环境是EST/EDT)**的时间,随后调用ToUniversalTime()是基于本地时区转UTC,导致后续转换结果不符合预期。要让输入字符串被识别为CST/CDT时区的时间,需要明确指定源时区来完成UTC转换。
解决方案
使用TimeZoneInfo.ConvertTimeToUtc()方法,传入源时间和对应的CST时区,替代依赖本地时区的ToUniversalTime()。这样就能确保输入的08:00:00被当作CST时区的时间来处理。
修改后的完整代码
using System.Globalization; // 获取CST时区 var cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); // 解析字符串为DateTime(此时未关联时区) DateTime sourceDt = DateTime.Parse("2023-09-05T08:00:00", CultureInfo.InvariantCulture); // 明确将源时间视为CST时区,转换为UTC DateTime sourceUtc = TimeZoneInfo.ConvertTimeToUtc(sourceDt, cstZone); // 转换回CST时区 var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var tzTime = TimeZoneInfo.ConvertTimeFromUtc(sourceUtc, tz); Console.WriteLine("Time1= " + tzTime.ToString("hh:mm tt", CultureInfo.InvariantCulture)); // 转换为EST时区 var tz2 = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var tz2Time = TimeZoneInfo.ConvertTimeFromUtc(sourceUtc, tz2); Console.WriteLine("Time2= " + tz2Time.ToString("hh:mm tt", CultureInfo.InvariantCulture));
结果说明
这段代码运行后,Time1会输出08:00 AM,Time2会输出09:00 AM,符合预期:
- 输入的
2023-09-05T08:00:00被明确识别为CST(夏令时为CDT,UTC-5)时间,转换为UTC是2023-09-05T13:00:00 - 将UTC时间转回CST时区,得到
08:00 AM - 将UTC时间转换为EST(夏令时为EDT,UTC-4)时区,得到
09:00 AM
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

