在指定时区创建DateTime,然后转换为UTC。

4

我需要创建一个DateTime,设置日期和时间,并使用特定的时区(例如:西亚标准时间、西欧标准时间等)。

必须保留夏令时,因此偏移量不可用,因为对于给定的时区,一年中的半年将会是+2小时,另一半则为+3小时。

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

我尝试以这种方式进行操作,以便稍后可以添加时区偏移量。但首先,我不喜欢这种解决方案,我担心在每年两次更改时间时会丢失一个小时;其次,我会收到以下错误:

"Utc DateTime实例的UTC Offset必须为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时间。

在JavaScript中存在库,其中给定的时区作为参数提供,但我必须在服务器端执行此操作。


时区可能因每个请求而异,且必须保留夏令时,因此偏移量不适用。我不理解这个声明。请详细解释为什么偏移量不适用。当您说“偏移量”时,您确切地指的是什么?您是否指的是“DateTimeOffset”类型(实际上,这几乎肯定是您应该使用的类型)?还是其他什么? - mjwills
请提供一个 [mcve]。非常清楚地说明输入是什么,以及您想要的确切输出是什么。您对问题的描述不清楚,无法确定您想要的结果和您为实现该结果所采取的步骤。我们真正想知道的是您想要的确切输出 - 以防您错误地解决了问题。 - mjwills
我想要一个方法,可以传入年、月、日、小时、分钟和时区,然后返回一个UTC时间。固定偏移量不适用,因为对于一半的年份来说,在给定的时区中,它将是+2小时,而另一半则是+3小时。 - Gohini
将它放在你的问题中。实际代码和实际值,并指定您想要的确切输出。最好在夏令时边界的两侧各举几个例子。 - mjwills
1
另外,你尝试过使用 DateTimeOffset 或者 NodaTime 吗?它们可行吗? - mjwills
我已经尝试过DateTimeOffset。我还没有检查过NodaTime,我会去看看的。谢谢。 - Gohini
1个回答

6

您需要使用TimeZoneInfo.ConvertTimeToUtc方法。

只需确保传递给方法的DateTime对象的Kind属性为Unspecified,否则该方法会对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);;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接