c# - 如何正确地将特定时区的午夜转换为UTC时间?
问题描述
这似乎是一个简单的问题,但看起来比看起来更难:
如何转换指定时区的午夜并将其转换为 Utc 时间(无论本地计算机的时区如何)?
一个例子:今天午夜 CET 是 UTC 时间的晚上 11 点(前一天)。
我尝试了以下方法:
DateTime midnight = TimeZoneInfo.ConvertTime(DateTime.UtcNow, specifiedTimeZoneInfo).Date;
DateTime utcTime = midnight.ToUniversalTime();
问题在于,仅当运行代码的本地计算机的时区与 TimeZoneInfo.ConvertTime 中使用的时区相同时,此代码才有效。
无论本地计算机的时区如何,如何做到这一点?
解决方案
考虑以下代码:
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.UtcNow
会12/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 AM
UTC。
推荐阅读
- node.js - ExpressJS jwt 身份验证保存在数据库中
- lua - Lua 内部结构:字符串方法如何作为方法工作?
- c++ - 制作使用 Direct 2D 渲染并使用更少 CPU 和 GPU 功率的应用程序
- python - `concurrent.futures._base.CancelledError` 使用 pymoo 运行 Dask
- javascript - webdriver.io browser.debug() 在异步函数中不起作用。为什么不是?
- javascript - 按钮上的反应组件功能不运行
- python - 在另一个(GET 和 POST)中运行 http 请求时出错
- angular - “null”类型的参数不能分配给参数 Angular
- c++ - 如何通过图案突出颜色
- java - 如何拆分由字母和整数组成的字符串