【问题标题】:Get list of time zones for a given offset in minutes using Noda Time使用 Noda Time 获取给定偏移量的时区列表(以分钟为单位)
【发布时间】:2019-02-07 02:02:58
【问题描述】:

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

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

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

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

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

我们发现您比格林威治标准时间早 5 小时 30 分钟。请选择您当前的时区:“Asia/Colombo”、“Asia/Kolkata”

【问题讨论】:

标签: c# datetime timezone nodatime


【解决方案1】:

你可以这样做:

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

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

在野田时间,你可以这样做:

using NodaTime;
using NodaTime.TimeZones;

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

【讨论】:

    【解决方案2】:

    Sweeper 代码的一种稍微替代的方法,使用目标偏移量而不是将每个偏移量转换为 TimeSpan,使用“现在”的单一计算(以获得一致的结果)并使用 IDateTimeZoneProvider.GetAllZones 扩展方法。

    using System;
    using System.Linq;
    using NodaTime;
    using NodaTime.Extensions;
    
    class Test
    {
        static void Main()
        {
            // No FromMinutes method for some reason...
            var target = Offset.FromSeconds(330 * 60);
            var now = SystemClock.Instance.GetCurrentInstant();
            var zones = DateTimeZoneProviders.Tzdb.GetAllZones()
                .Where(zone => zone.GetUtcOffset(now) == target);
            foreach (var zone in zones)
            {
                Console.WriteLine(zone.Id);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2013-09-29
      相关资源
      最近更新 更多