C# 按不同时区获取时间的日期?

C# 按不同时区获取时间的日期?,c#,datetime,timezone,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 = DateTim

以下代码将按时区返回正确的日期
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要快得多,但是我需要维护一个小时偏移量查找表,以及夏时制更改的逻辑()


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

不确定我们是否从您那里获得了足够的信息(请参见您对问题的评论),但我要指出:

DateTimeOffset result = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTimeOffset, timeZoneId)
。。。相当于:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTimeOffset result = TimeZoneInfo.ConvertTime(dateTimeOffset, tzi);
因此,如果您重复使用同一个区域,只需查找一次
TimeZoneInfo
对象,并将其保留下来,以便在将来的转换中重用,就可以获得更好的结果


我说的只是稍微快一点,因为
FindSystemTimeZoneById
ConvertTimeBySystemTimeZoneId
都使用内部缓存。因此,您没有减少分配,只是减少了从缓存中查找项目所需的时间。

非常困惑,您的问题是什么?为什么您认为它不够快?您运行了哪些基准测试?如果您有一个复杂的日期/时区问题,Noda Time(nodatime.org)通常是解决方案的一部分,那么您使用的是哪个.NET运行时?你每次传递的时区ID是相同的还是不同的?@MattJohnson Pint,10万次呼叫大约需要2秒。老实说,这在我看来仍然是一个微观优化。在现实生活中,我们是否需要更快的解决方案?也许是一些学术/科学研究?我不知道。我认为OP首先应该知道哪种方式更快:)