Azure Functions (C#):获取时区 ID (NodaTime)

Azure Functions (C#): get time zone ids (NodaTime)

我有一个时间触发的 Azure 函数。 Azure Function 每次都在 00:00 am(当地时间)的某处启动。我想要实现的是在 Azure 函数为 运行 时找到当前 00:00 的时区的时区字符串(例如 Europe/London)。

即,我提供了一个 UTC 值,它为我提供了当前 00:00 当地时间的所有时区 ID。

如何使用 NodaTime 实现?

我的第一个方法(原型)如下所示:

using System;
using System.Collections.Generic;
using NodaTime;

namespace TimeZones
{
    class Program
    {
        static void Main(string[] args)
        {
            Instant utcDateTime = Instant.FromDateTimeUtc(DateTime.UtcNow);
            Console.WriteLine(utcDateTime);
            List<string> zoneIds = GetTimeZonesWithCondition(utcDateTime, 0, 0);

            Console.ReadLine();
        }

        static List<string> GetTimeZonesWithCondition(Instant utcDateTime, int hourComparison, int minuteComparison)
        {
            List<string> zoneIdsCheck = new List<string>();
            IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;

            foreach (var id in timeZoneProvider.Ids)
            {
                var zone = timeZoneProvider[id];
                var zoneDateTime = utcDateTime.InZone(zone);

                int hourZone = zoneDateTime.Hour;
                int minuteZone = zoneDateTime.Minute;

                if (hourZone == hourComparison && minuteZone == minuteComparison)
                {
                    zoneIdsCheck.Add(zone.ToString());
                    Console.WriteLine($"{zone} / {zoneDateTime}");
                }
            }

            return zoneIdsCheck;
        }
    }
}

如果有人有更好的解决方案请告诉我。

比你的稍微简单的版本,如果你总是想检查午夜:

static List<string> GetTimeZonesAtMidnight(Instant instant) =>
    // Extension method in NodaTime.Extensions.DateTimeZoneProviderExtensions
    DateTimeZoneProviders.Tzdb.GetAllZones()
        .Where(zone => instant.InZone(zone).TimeOfDay == LocalTime.Midnight)
        .Select(zone => zone.Id)
        .ToList();

如果您需要检查 non-midnight 值,请传入 LocalTime:

static List<string> GetTimeZonesAtMidnight(Instant instant, LocalTime timeOfDay) =>
    // Extension method in NodaTime.Extensions.DateTimeZoneProviderExtensions
    DateTimeZoneProviders.Tzdb.GetAllZones()
        .Where(zone => instant.InZone(zone).TimeOfDay == timeOfDay)
        .Select(zone => zone.Id)
        .ToList();