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

在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:00