首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#在DateTime.ParseExact中手动指定时区

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

Stack Overflow用户
提问于 2019-10-03 20:14:47
回答 1查看 538关注 0票数 3

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

代码语言: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来确定抵消时间的时间量。这假定时间已经在所需的时区中被解析。

EN

回答 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));
   }
}

// The example displays output like the following when run on a system in the
// U.S. Pacific Standard Time zone:
//       Time in Pacific Standard Time zone: 12/6/2013 10:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
//       Time in Tokyo Standard Time zone: 12/7/2013 3:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58226296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档