首页 > 解决方案 > 使用 Noda Time 获取给定偏移量的时区列表(以分钟为单位)

问题描述

我正在尝试使用 Noda Time 设计以下时区解决方案:

用户将使用移动应用程序或 Web 应用程序登录系统。在登录时,将使用与 UTC 的偏移量(比如说 x 分钟)作为参数调用 Web API。

现在,如果偏移量(x 分钟)与保存在数据库中的偏移量(和时区)不同,那么将向用户显示距离 UTC x 分钟的时区列表,以便他们可以从中选择一个。然后,选定的时区和相应的偏移量(x 分钟)将作为用户的最新时区保存在数据库中。

如何使用 Noda Time 获取距离 UTC x 分钟的时区列表?

例如,如果用户距 UTC +330 分钟,那么用户将收到以下提示:

我们发现您比格林威治标准时间早 5 小时 30 分钟。请选择您当前的时区:“亚洲/科伦坡”、“亚洲/加尔各答”

标签: c#datetimetimezonenodatime

解决方案


你可以这样做:

TimeZoneInfo.GetSystemTimeZones()
    .Where(x => x.GetUtcOffset(DateTime.Now).TotalMinutes == 330)

现在您有了一个时区集合!您可以根据您的情况替换DateTime.Now为其他日期或日期。DateTimeOffset

在 Noda Time 中,您可以这样做:

using NodaTime;
using NodaTime.TimeZones;

TzdbDateTimeZoneSource.Default.GetIds()
    .Select(x => TzdbDateTimeZoneSource.Default.ForId(x))
    .Where(x => 
        x.GetUtcOffset(SystemClock.Instance.GetCurrentInstant()).ToTimeSpan().TotalMinutes == 330)

推荐阅读