获取不同时区的时间日期?

时间:2020-01-17 23:09:26

标签: c# datetime timezone

以下代码将按时区返回正确的日期。就我而言,TimeZoneInfo.ConvertTimeBySystemTimeZoneId还不够快。这是更快的方法吗?

// Return the date part of t by tz
DateTime GetDateByTZ(DateTimeOffset t, string tz)
{
    return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(t, tz).Date;
}

var t1 = DateTimeOffset.Parse("1/17/2020 21:00 -5");
GetDateByTZ(t1, 'GMT Standard Time') // returns 2020-1-18

我需要GetDateByTZ的超级快版本。

我发现使用t.AddHours(...).Date的速度要快得多,但随后我将需要维护一个小时偏移量查找表,以及夏令时更改的逻辑(https://en.wikipedia.org/wiki/Daylight_saving_time)。

例如,如果我在伦敦,我可以致电DateTime.Now.AddHours(-5).Date以获取“东部标准时间”的日期。但是,夏天我需要将-5更改为-4。

1 个答案:

答案 0 :(得分:0)

不确定我们是否能从您那里获得足够的信息(请参阅有关您问题的评论),但我会指出这一点:

DateTimeOffset result = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTimeOffset, timeZoneId)

...等效于此:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTimeOffset result = TimeZoneInfo.ConvertTime(dateTimeOffset, tzi);

因此,如果您反复使用同一区域,则通过查找TimeZoneInfo对象一次并保留该对象以在以后的转换中重复使用,可以获得更好的效果。 / p>

我说的时间稍快,因为FindSystemTimeZoneByIdConvertTimeBySystemTimeZoneId都使用内部缓存。因此,您不必减少分配,而只需减少从缓存中查找项目所需的时间。