如何正确将特定时区的午夜时间转换为UTC时间?

4

这似乎是一个简单的问题,但实际上比看起来要难:

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

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

我尝试了以下方法:

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

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

如何做到不考虑本地计算机的时区呢?

1个回答

5

请看下面的代码:

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.UtcNow2018年12月29日晚上11:30 时,将会得到以下结果:

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时间是2018年12月29日-晚上11:30:00,那么午夜在2018年12月29日-UTC时间下午12:00:00已经过去了23:30小时。

以上代码将返回 12:00:00 AM UTC,无论时区如何。如果这不是您要寻找的,请详细说明您要寻找什么。 - Reza Aghaei
这是您正在寻找的吗? - Reza Aghaei
以上代码和示例描述了UTC和CET中的小时数,独立于客户端时区。 - Reza Aghaei
我添加了更多的描述以防止任何混淆。 - Reza Aghaei
1
现在看起来正确,正是我想要的! - OlavT

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