【问题标题】:C# Manually specify a timezone in DateTime.ParseExactC# 在 DateTime.ParseExact 中手动指定时区
【发布时间】:2019-10-03 20:14:47
【问题描述】:

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

2019/10/01 15:30

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

如果我在我自己的 PC 上使用这个 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。我查看了this questionthis question,但它们似乎都取决于系统本身设置为您想要假设日期所在的时区。

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

【问题讨论】:

标签: c# datetime timezone date-conversion


【解决方案1】:

我相信您正在寻找的是TimeZoneInfo

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

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

取自TimeZoneInfo.FindSystemTimeZoneById的代码示例

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

【讨论】:

  • 正是我需要的。 ConvertTimeToUtc 方法允许您为源指定显式时区。谢谢。作为旁注,我想知道这如何处理模棱两可的时间(例如秋季 DST 转换期间的一小时重叠)
猜你喜欢
  • 2011-09-16
  • 2011-10-04
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多