首页 > 解决方案 > 在特定时区创建 DateTime 然后转换为 utc

问题描述

我需要创建一个具有设定日期和时间的 DateTime,该日期和时间将位于特定时区(西亚标准时间、西欧标准时间等)。

必须保留 DST,因此偏移量已取消,因为对于给定的时区,一年中有一半是 +2h,另一半是 +3h。

然后我想将日期转换为 UTC。

我试图这样做,以便以后可以添加这个时区偏移量。但是,首先我不喜欢这种解决方案,而且我担心每年两次更改时间会损失一个小时,其次我会收到错误消息:

“UTC 日期时间实例的 UTC 偏移量必须为 0。”

var testTime = new DateTime(testDate.Year, testDate.Month, testDate.Day, 4, 0, 0, DateTimeKind.Utc);
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("West Asia Standard Time");
var timezoneTime = TimeZoneInfo.ConvertTimeFromUtc(runTime, timeZoneInfo);
var offset = timeZoneInfo.GetUtcOffset(timezoneTime);

我想得到这种代码

var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("West Asia Standard Time");
var testTime = new DateTime(testDate.Year, testDate.Month, testDate.Day, 4, 0, 0, timeZoneInfo);
var utcTime = testTime.ToUniversalTime();

所以,总而言之,我想要一个方法,在其中传递年、月、日、小时、分钟和时区,作为回报,我将获得 UTC 格式的 DateTime 在 javascript 中有库,其中给出了给定的时区作为参数,但我必须在服务器端进行。

标签: c#.net-core

解决方案


您基本上需要TimeZoneInfo.ConvertTimeToUtc方法。

只要确保Kind传递的属性DateTimeUnspecified,否则该方法对sourceTimeZone参数有特殊的期望并会抛出异常。

例如

var testTime = new DateTime(testDate.Year, testDate.Month, testDate.Day, 4, 0, 0);
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("West Asia Standard Time");
var utcTime = TimeZoneInfo.ConvertTimeToUtc(testTime, timeZoneInfo);;

推荐阅读