dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本
本文告诉大家在拿到任意时区的 DateTimeOffset 对象,将 DateTimeOffset 转换为使用中国的 +8 时区表示的时间
在开始之前,需要说明的是,采用 DateTimeOffset 会比 DateTime 更优的一个点是 DateTimeOffset 是带上时区的,这就意味着方便的在多个不同的时区进行传递和序列化的时候,不会丢失原来的信息
现在也推荐更多的使用 DateTimeOffset 类型而不是 DateTime 类型,除非是明确只有本机时间且后续没有需求变更才会考虑使用 DateTime 类型
可选的转换为任意国家地区的时区时间,可以是先通过 TimeZoneInfo 的 FindSystemTimeZoneById 获取到对应的国家地区的信息,如下面代码获取到中国的信息
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
这里的 FindSystemTimeZoneById 传入的 Id 可选的列表可以参阅你的本机注册表的 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones
的列表,详细请看 TimeZoneInfo.FindSystemTimeZoneById(String) 方法 (System) Microsoft Learn
假设能获取到 TimeZoneInfo 那可以通过 GetUtcOffset 获取对比传入的 DateTimeOffset 的时间
var timeSpan = timeZoneInfo.GetUtcOffset(dateTimeOffset);
如此获取到的 TimeSpan 就是时区之间的差值,相加即可转换为目标国家地区的时间
var newDateTimeOffset = dateTimeOffset + timeSpan;
以上代码拿到的 newDateTime
就是转换后的时区时间
全部的代码如下,通过以下代码即可将任意时区的时间转换为中国对应的时区的时间
TimeZoneInfo? timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
TimeSpan timeSpan = timeZoneInfo.GetUtcOffset(dateTimeOffset);
DateTimeOffset newDateTimeOffset = dateTimeOffset + timeSpan;
修改 China Standard Time
字符串为其他国家地区的,即可转换为其他国家地区的时区
在有一些奇怪的系统上,会抛出 TimeZoneNotFoundException 异常,此时可以使用固定中国的 +8 小时作为对比 UTC 时间
此时需要先将传入的 DateTimeOffset 转换为 UTC 时间,代码如下
DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime();
接着直接执行 +8 小时即可转换为中国时间
TimeSpan timeSpan = TimeSpan.FromHours(8);
DateTimeOffset newDateTimeOffset = utcDateTimeOffset + timeSpan;
全部的代码如下
DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime();
TimeSpan timeSpan = TimeSpan.FromHours(8);
DateTimeOffset newDateTimeOffset = utcDateTimeOffset + timeSpan;
以上就是转换为中国时间的方法
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容
![知识共享许可协议](https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。