我们有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的情况下进行时区转换。
答案 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时区数据不足的边缘情况。