以下代码将按时区返回正确的日期。就我而言,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。
答案 0 :(得分:0)
不确定我们是否能从您那里获得足够的信息(请参阅有关您问题的评论),但我会指出这一点:
DateTimeOffset result = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTimeOffset, timeZoneId)
...等效于此:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTimeOffset result = TimeZoneInfo.ConvertTime(dateTimeOffset, tzi);
因此,如果您反复使用同一区域,则通过查找TimeZoneInfo
对象一次并保留该对象以在以后的转换中重复使用,可以获得更好的效果。 / p>
我说的时间稍快,因为FindSystemTimeZoneById
和ConvertTimeBySystemTimeZoneId
都使用内部缓存。因此,您不必减少分配,而只需减少从缓存中查找项目所需的时间。