我们遇到了一个问题,其中一位开发人员编写了以下代码,并且在他的 DEV 环境中运行正常。但是当代码提交到 QA 后,出现以下错误信息导致代码无法运行:
myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(myRecord.StartTime, myTimeZone);
转换无法完成,因为提供的 DateTime 对象未正确设置 Kind 属性。例如,当 Kind 属性为 DateTimeKind.Local 时,源时区必须为 TimeZoneInfo.Local。
在我的 DEV 环境中,上述代码生成与 QA 服务器相同的错误。我应用了以下更改来解决问题:
DateTime utcStart = DateTime.SpecifyKind(myRecord.StartTime, DateTimeKind.Unspecified);
myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(utcStart, myTimeZone);
第一个代码示例为什么在DEV1的环境中可以正常工作,但在我的DEV环境和我们的QA服务器上会出现错误?
DateTime.SpecifyKind
来获得相同的结果。 - Matt Johnson-PintDateTimeKind.Local
旨在表示“本地机器”的本地时间,而不是“某个时区”的本地时间,这是非常愚蠢的设计决策。关于DateTime
和时区的设计决策已经过时了,这在.NET 1.0之后是相当罕见的。 - rianjs