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

C#中DateTime.UtcNow时区转换报错:为何与new DateTime表现不同?

C#中英国时间转换时的ArgumentException错误原因及DateTime对象差异

问题场景

尝试在C#中进行时区转换时,编写了如下代码:

DateTime utc = DateTime.UtcNow;
var ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime ukTime = TimeZoneInfo.ConvertTime(utc, ukTimeZone, TimeZoneInfo.Local );

Console.WriteLine(ukTime);

运行时抛出如下错误:

Unhandled exception. System.ArgumentException: The conversion could
not be completed because the supplied DateTime did not have the Kind
property set correctly. For example, when the Kind property is
DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local.
(Parameter 'sourceTimeZone')
at System.TimeZoneInfo.ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone,
TimeZoneInfoOptions flags, CachedData cachedData)
at System.TimeZoneInfo.ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone)

但运行以下代码却得到预期结果11/09/2022 23:47:00:

DateTime time = new DateTime(2022, 11, 09, 23, 47, 00);
var ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime ukTime = TimeZoneInfo.ConvertTime(time, ukTimeZone, TimeZoneInfo.Local );
Console.WriteLine(ukTime);

核心疑问

该错误为何发生?time与utc之间有何区别?


错误原因

DateTime.UtcNow返回的DateTime对象,其Kind属性被标记为DateTimeKind.Utc,明确表示这是UTC时间。而调用TimeZoneInfo.ConvertTime时,传入的sourceTimeZone是英国时区(GMT Standard Time),这和utc的Kind属性不匹配——.NET有严格校验规则:当DateTime的Kind不为Unspecified时,sourceTimeZone必须和Kind对应(比如Kind=Utc时,源时区必须是TimeZoneInfo.Utc;Kind=Local时,源时区必须是TimeZoneInfo.Local),不匹配就会抛出ArgumentException。

time与utc的区别

  • utc对象:通过DateTime.UtcNow生成,Kind属性为DateTimeKind.Utc,带有明确的UTC时区标记,.NET会严格校验它和传入时区的匹配性。
  • time对象:通过无时区参数的构造函数new DateTime(...)生成,Kind属性默认是DateTimeKind.Unspecified,没有明确的时区标记。这种情况下,.NET会直接将其当作sourceTimeZone参数指定的时区(英国时区)的时间处理,不会触发Kind与时区的校验,因此能正常运行。

正确的转换写法

如果需求是将UTC时间转换为英国时间,建议使用专门的ConvertTimeFromUtc方法,无需手动指定源时区:

DateTime utc = DateTime.UtcNow;
var ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime ukTime = TimeZoneInfo.ConvertTimeFromUtc(utc, ukTimeZone);
Console.WriteLine(ukTime);

如果是将英国时间转换为UTC,可使用ConvertTimeToUtc方法,确保源时间的时区标记正确即可。


内容的提问来源于stack exchange,提问作者hanushi-thana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:36:26