相关文章推荐
豁达的香蕉  ·  终于放弃了fastjson,迁移至Gson! ...·  7 月前    · 
风流的冰淇淋  ·  ‘gpedit.msc‘ ...·  11 月前    · 
爱旅游的手套  ·  uni-app实现用AI自行绘制的SVG矢量 ...·  11 月前    · 
慷慨大方的面包  ·  驱动程序无法通过使用安全套接字层(SSL)加 ...·  1 年前    · 
千年单身的红薯  ·  android ...·  2 年前    · 
Code  ›  C#在DateTime.ParseExact中手动指定时区开发者社区
utc tst
https://cloud.tencent.com/developer/ask/sof/108488447
性感的小蝌蚪
7 月前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 C#在DateTime.ParseExact中手动指定时区

Stack Overflow用户
提问于 2019-10-03 20:14:47
EN

我有一个日志文件,其中包含格式如下的日期/时间字符串:

代码语言: javascript
复制
2019/10/01 15:30

如您所见,字符串不包含任何时区信息。但是,我确实知道时间在其中所代表的时区。

如果我在我自己的PC上使用这个C#代码,它的本地时区设置是正确的,那么时间将按预期进行解析。我希望将本地时间转换为UTC,以便插入数据库。

代码语言: javascript
复制
Time.ParseExact("2019/10/01 15:30", "yyyy/MM/dd HH:mm", provider, DateTimeStyles.AdjustToUniversal & DateTimeStyles.AssumeLocal);

但是,如果我在我的Docker主机上运行此代码,它的时区设置为UTC,则时间被解析为UTC。这是有意义的,因为在使用UTC的Docker主机上, AssumeLocal 将与UTC相同。

仅仅应用人工偏移是不够的,因为夏令时。此外,其中一些日志是历史的,可以追溯到DST更改之前,因此即使使用算法也会很复杂,而且似乎应该解决一些问题(例如,给定日期和时区,确定它是否在DST中,然后相应地调整到UTC )。

我想要做的是显式地指定时间戳的时区,并让框架同时使用给定的时区和实际的日期来正确地将时间转换为UTC。我看过 这个问题 和 这个问题 ,但它们似乎都依赖于系统本身被设置为您想要假定日期在的时区。

第二个问题似乎已经开始解决假定一个已知时区的问题,但是响应只是在解析的时间上使用 GetUtcOffset 来确定抵消时间的时间量。这假定时间已经在所需的时区中被解析。

1 538 0 票数 3
EN
c#
datetime
timezone
date-conversion

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 20:53:54

我相信你要找的是 TimeZoneInfo 。

使用TimeZoneInfo,您可以从 TimeZoneInfo.FindSystemTimeZoneById 获得所需的信息。

这些Ids是基于操作系统的,但是只要您的所有容器都在Linux上(举个例子),您就可以使用它获得UTC的存储时间。您提到您知道您的字符串位于哪个时区,因此您可能需要一些东西来将其转换为TimeZoneInfo可读的Ids。

从 TimeZoneInfo.FindSystemTimeZoneById 获取的代码示例

代码语言: javascript
复制
using System;
public class Example
   public static void Main()
      // Get time in local time zone 
      DateTime thisTime = DateTime.Now;
      Console.WriteLine("Time in {0} zone: {1}", TimeZoneInfo.Local.IsDaylightSavingTime(thisTime) ?
                        TimeZoneInfo.Local.DaylightName : TimeZoneInfo.Local.StandardName, thisTime);
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(thisTime, TimeZoneInfo.Local));
      // Get Tokyo Standard Time zone
      TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
      DateTime tstTime = TimeZoneInfo.ConvertTime(thisTime, TimeZoneInfo.Local, tst);      
      Console.WriteLine("Time in {0} zone: {1}", tst.IsDaylightSavingTime(tstTime) ?
                        tst.DaylightName : tst.StandardName, tstTime);
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(tstTime, tst));
 
推荐文章
豁达的香蕉  ·  终于放弃了fastjson,迁移至Gson!-腾讯云开发者社区-腾讯云
7 月前
风流的冰淇淋  ·  ‘gpedit.msc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。_gpedit.msc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。-CSDN博客
11 月前
爱旅游的手套  ·  uni-app实现用AI自行绘制的SVG矢量图片-base64转换法_uniapp svg 转base64-CSDN博客
11 月前
慷慨大方的面包  ·  驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:“The server selected protocol version TLS10 is not accepted by client_MsSql_脚本之家
1 年前
千年单身的红薯  ·  android DatePickerDialog设置日期限制_shangxinlei88的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号