nodeatime根据CountryCode获取国家时间

本文关键字:国家 时间 获取 CountryCode 根据 nodeatime | 更新日期: 2023-09-27 18:14:24

我有一个要求,管理员将为该国家列表的用户选择一些countries ListTime for Alert

假设管理员在国家India,Malaysia and Canada中选择24/07/2014 09:00 AM,他们需要根据their TimeZone获得警报,每个国家的用户需要在User's Local 9 AM Time获得警报。

我只有它们的country Codes比如IN,MY,CA

所以,我想得到他们的时区和计算基于Server Time

例如:我的服务器位于Canada,因此,我想到基于India TimeZonesave the Time in Db计算India中的Time to Alert,因此我的windows服务将在印度时间运行并推送警报。

但是为此,我需要在Db中保存不同时间的多条记录。

所以,为了获得基于国家代码的TimeZone,我使用了 nodeatime

var CountryInfo = (from location in TzdbDateTimeZoneSource.Default.ZoneLocations
                     where location.CountryCode.Equals(CountryCode,
                           StringComparison.OrdinalIgnoreCase)
                     select new { location.ZoneId, location.CountryName })
                 .FirstOrDefault();

我从这个查询中得到TimeZoneID
能否根据Admin's Selected DateTime得到CountryCodeCurrentDate and Time ?

nodeatime根据CountryCode获取国家时间

您的代码几乎是正确的-尽管它可以稍微简化,并使其更易于测试,并且它应该处理没有这样的区域的情况…

// You should use dependency injection really - that makes the code much more
// testable. Basically, you want an IClock...
IClock clock = SystemClock.Instance;
var countryCode = "IN";
var location = TzdbDateTimeZoneSource.Default.ZoneLocations
                 .FirstOrDefault(l => l.CountryCode == countryCode);
if (location == null)
{
    // This is up to you - there's no location with your desired country code.
}
else
{
    var zone = DateTimeZoneProviders.Tzdb[location.ZoneId];
    var zonedNow = clock.Now.InZone(zone);
    // Now do what you want with zonedNow... I'd avoid going back into BCL
    // types, myself.
}

请记住,这里假设一个国家只有一个时区——情况并非总是如此。想想美国,那里有很多时区…

我使用下面的代码获取日期:

string CountryCode = "IN";
                var CountryInfo = (from location in TzdbDateTimeZoneSource.Default.ZoneLocations
                                   where location.CountryCode.Equals(CountryCode,
                                              StringComparison.OrdinalIgnoreCase)
                                   select new { location.ZoneId, location.CountryName })
                 .FirstOrDefault();
                var TimeZone = DateTimeZoneProviders.Tzdb[CountryInfo.ZoneId];
                DateTime objdate = Instant.FromDateTimeUtc(DateTime.UtcNow)
                          .InZone(TimeZone)
                          .ToDateTimeUnspecified();