代码之家  ›  专栏  ›  技术社区  ›  fdmillion

C#在中手动指定时区日期时间.ParseExact

  •  3
  • fdmillion  · 技术社区  · 5 年前

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

    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。这是有道理的,因为在使用UTC的Docker主机上 AssumeLocal 将与UTC相同。

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

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

    GetUtcOffset 对时间进行解析,以确定时间量来抵消时间。这假设时间已在所需时区中解析。

    0 回复  |  直到 5 年前
        1
  •  1
  •   rainydevbs    5 年前

    TimeZoneInfo

    使用TimeZoneInfo,您可以从 TimeZoneInfo.FindSystemTimeZoneById .

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

    代码示例取自

    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