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

C#在DateTime.ParseExact中手动指定时区,c#,datetime,timezone,date-conversion,C#,Datetime,Timezone,Date Conversion,我有一个日志文件,其中包含如下格式的日期/时间字符串: 2019/10/01 15:30 如您所见,字符串不包含任何时区信息。但是,我确实知道表示时间的时区 如果我在自己的电脑上使用这个C#代码,它的本地时区设置正确,那么时间就会按预期进行解析。我希望将本地时间转换为UTC,以便插入数据库 Time.ParseExact("2019/10/01 15:30", "yyyy/MM/dd HH:mm", provider, DateTimeStyles.AdjustToUniversal &

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

2019/10/01 15:30
如您所见,字符串不包含任何时区信息。但是,我确实知道表示时间的时区

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

Time.ParseExact("2019/10/01 15:30", "yyyy/MM/dd HH:mm", provider, DateTimeStyles.AdjustToUniversal & DateTimeStyles.AssumeLocal);
但是,如果我在我的一台Docker主机上运行此代码(其时区设置为UTC),则时间将解析为UTC。这是有道理的,因为在Docker主机上使用UTC
AssumeLocal
将与UTC相同

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

我希望能够显式地为时间戳指定时区,并让框架使用给定的时区和实际日期来正确地将时间转换为UTC。我已经看过了,但它们似乎都依赖于系统本身被设置为您想要假设日期所在的时区


第二个问题似乎开始解决假设一个已知时区的问题,但随后的响应只使用解析时间上的
GetUtcOffset
来确定偏移时间的时间量。这假设时间已在所需时区中解析。

我相信您要查找的是

使用TimeZoneInfo,您可以从中获得所需的信息

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

代码示例取自


provider
设置为什么?另外,我想你是指
DateTime.ParseExact
?这就是你要找的吗?编辑:我误读了,我看到你的机器不一定会在你想要的时区。不过,您可能仍然会发现使用来指定时区有些用处。这正是我所需要的。ConvertTimeToUtc方法允许您为源指定显式时区。谢谢作为旁注,我想知道这是如何处理不明确的时间(例如,在秋季DST转换期间一小时的重叠)
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