如何从NodaTime的偏移中获取所有IANA时区?

Fre*_*III 3 c# asp.net-mvc timezone datetimeoffset nodatime

在我们的ASP.NET MVC 5应用程序中,我们拥有带有时区ID(IANA)的用户配置文件.

public class User
{
    public int Id { get; set; }
    public string TimeZoneId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

任务是在当地时间早上6点向所有用户发送电子邮件.我们的计划是每小时向所有时区发送电子邮件,当地时间是当时时间早上6点(根据服务器的UTC时间计算).

由于我们只有时区ID,我希望得到相应的时区ID,比方说,偏移-4:00:00 - 考虑到DST.

string[] timezoneIds;
Run Code Online (Sandbox Code Playgroud)

然后,我可以像这样查询我的数据库:

db.Users.Where(x => timezoneIds.Contains(x.TimeZoneId));
Run Code Online (Sandbox Code Playgroud)

我的问题显然是,这是一个体面的想法,还是我不知道这个问题的最佳做法?

谢谢.

Jon*_*eet 6

Serge显示的"构建字典"的简单代码:使用LINQ的查找DateTimeZone.GetUtcOffset,和Offset键而不是TimeSpan值:

var now = SystemClock.Instance.Now;
var provider = DateTimeZoneProviders.Tzdb;
var idsByCurrentOffset = provider.Ids.ToLookup(id => provider[id].GetUtcOffset(now));
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

var offset = Offset.FromHours(5);
foreach (var id in idsByCurrentOffset[offset])
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

(您甚至不需要首先检查是否存在,因为查找索引器在显示查找中不存在的键时返回空序列.)