将时间戳从任何时区转换为UTC,并且可选择不使用DST

时间:2018-02-28 09:59:51

标签: c# timezone utc

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

06-02-2018 15:04:21

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

到目前为止我们所知道的是,到目前为止我们已经看到了这一点:

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

由此我们收集到需要一个引擎,它可以接受任何时间戳(以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的情况下进行时区转换。

1 个答案:

答案 0 :(得分: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时区数据不足的边缘情况。