【问题标题】:Convert timestamp from any timezone to UTC, and optionally without DST将时间戳从任何时区转换为 UTC,并且可以选择不使用 DST
【发布时间】:2018-08-08 03:55:12
【问题描述】:

我们有来自 CSV 文件的时间戳,如下所示:

06-02-2018 15:04:21

我们不控制它们的交付,也不控制时区。

到目前为止,我们所知道的是,到目前为止我们所看到的是:

标准浪漫时间 标准浪漫时间,但没有 DST 补偿。 世界标准时间

据此,我们了解到我们需要一个引擎,它可以采用任何时间戳(以 DateTime.ParseExact 理解的模式编写),属于任何时区,可选择忽略 DST,然后将其转换为 UTC(我们内部使用的格式)。

我希望这可以做到:

public DateTime ConvertToUtc(string fromTimestamp, DataReaderConfiguration dataReaderConfiguration)
{
  DateTime readTime = DateTime.ParseExact(fromTimestamp, dataReaderConfiguration.TimestampFormat,
    CultureInfo.InvariantCulture, DateTimeStyles.None);
  DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(readTime,
    TimeZoneInfo.FindSystemTimeZoneById(dataReaderConfiguration.TimeZone));
  return utcTime;
}

但是 C# 没有定义没有 DST 的时区(UTC 除外)。

因此我们需要扩展该方法以允许在没有 DST 的情况下进行时区转换。

【问题讨论】:

    标签: c# timezone utc


    【解决方案1】:

    您可以自己创建此函数,方法是利用 TimeZoneInfo.BaseUtcOffset 属性和 DateTimeOffset

    public static DateTime ConvertTimeToUtc(DateTime dt, TimeZoneInfo tz, bool useDST)
    {
        if (useDST)
        {
            // the normal way (converts using the time in effect - standard or daylight)
            return TimeZoneInfo.ConvertTimeToUtc(dt, tz);
        }
    
        // the way to convert with just the standard time (even when DST is in effect)
        var dto = new DateTimeOffset(dt, tz.BaseUtcOffset);
        return dto.UtcDateTime;
    }
    

    然后只需从您的 DataReaderConfiguration 对象中传递任何属性,该属性表明您是否要使用 DST(或在必要时取消它)。

    另请注意,这给出了基于当前 规则集的标准时间。如果您正在处理时区标准时间发生变化的历史日期,事情会变得有点复杂。您必须弄清楚当时有哪些调整规则,等等。您甚至可能会发现 Windows 时区数据不足的极端情况。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2012-10-21
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多