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

时间:2019-05-27 14:57:34

标签: c# datetime azure-functions utc nodatime

我有一个被时间触发的Azure函数。每次在凌晨00:00(本地时间)某个地方启动Azure函数。我想实现的是找到运行Azure函数时当前是00:00的时区的时区字符串(例如Europe/London)。

即,我提供一个UTC值,并且它提供了我所有的时区ID(当前是当地时间上午00:00)。

如何使用NodaTime来实现?

2 个答案:

答案 0 :(得分:3)

如果您总是想检查午夜时间,则它比您的版本要简单一些:

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

答案 1 :(得分:0)

我的第一种方法(原型)如下:

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

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