Функции Azure (C #): получить идентификаторы часовых поясов (NodaTime) - PullRequest
1 голос
/ 27 мая 2019

У меня есть функция Azure, которая срабатывает по времени. Функция Azure запускается каждый раз, когда это где-то в 00:00 (местное время). Чего я хотел бы добиться, так это найти строки часовых поясов (например, Europe/London) для часовых поясов, в которых сейчас 00:00, когда работает функция Azure.

Т.е., я предоставляю значение UTC, и оно предоставляет мне все идентификаторы часовых поясов, где в настоящее время 00:00 по местному времени.

Как мне добиться этого с помощью NodaTime?

Ответы [ 2 ]

4 голосов
/ 28 мая 2019

Немного более простая версия, чем ваша, если вы всегда хотите проверить на полночь:

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();

Если вам нужно проверить не полночь, передайте 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();
0 голосов
/ 27 мая 2019

Мой первый подход (прототип) выглядит следующим образом:

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;
        }
    }
}

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать.

...