首页 > 解决方案 > 如何正确地将特定时区的午夜转换为UTC时间?

问题描述

这似乎是一个简单的问题,但看起来比看起来更难:

如何转换指定时区的午夜并将其转换为 Utc 时间(无论本地计算机的时区如何)?

一个例子:今天午夜 CET 是 UTC 时间的晚上 11 点(前一天)。

我尝试了以下方法:

DateTime midnight = TimeZoneInfo.ConvertTime(DateTime.UtcNow, specifiedTimeZoneInfo).Date;
DateTime utcTime = midnight.ToUniversalTime();

问题在于,仅当运行代码的本地计算机的时区与 TimeZoneInfo.ConvertTime 中使用的时区相同时,此代码才有效。

无论本地计算机的时区如何,如何做到这一点?

标签: c#.netdatetime

解决方案


考虑以下代码:

var cestZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");

var cestNow = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, cestZone);
var cestMidnight = cestNow.Date;
var cestMidnightInUTC = TimeZoneInfo.ConvertTimeToUtc(cestMidnight, cestZone);

什么时候DateTime.UtcNow12/29/2018 - 11:30:00 PM导致:

If you live in CEST and look at clock
cestNow:           12/30/2018 - 12:30:00 AM     

If you live in CEST and had a look at clock at midnight (start of today, 30 minutes ago)
cestMidnight:      12/30/2018 - 12:00:00 AM 

At your midnight, UTC was
cestMidnightInUTC: 12/29/2018 - 11:00:00 PM

注意:12:00:00 AM是一天的开始。因此,例如,如果 UTC 现在是12/29/2018 - 11:30:00 PM,则午夜是23:30几个小时前的12/29/2018 - 12:00:00 AMUTC。


推荐阅读