我有一个被时间触发的Azure函数。每次在凌晨00:00(本地时间)某个地方启动Azure函数。我想实现的是找到运行Azure函数时当前是00:00的时区的时区字符串(例如Europe/London
)。
即,我提供一个UTC值,并且它提供了我所有的时区ID(当前是当地时间上午00:00)。
如何使用NodaTime来实现?
答案 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;
}
}
}
如果有人有更好的解决方案,请告诉我。