NodaTime根据CountryCode获取国家/地区时间

时间:2014-07-23 08:18:23

标签: c# asp.net datetime utc nodatime

我要求管理员为该国家/地区列表的用户选择一些countries ListTime for Alert

让我们说管理员在国家24/07/2014 09:00 AM中选择India,Malaysia and Canada, 他们需要根据their TimeZone获取提醒,并且每个国家/地区用户都需要在User's Local 9 AM Time处获取提醒。

所以,我只有country Codes喜欢 IN,MY,CA

所以,我想到了他们的TimeZones并根据Server Time进行计算。

例如:我的服务器位于Canada。因此,我考虑根据Time to AlertIndia计算India TimeZone中的save the Time in Db。所以我的Windows服务将在印度时间运行并推送警报。

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

所以,为了根据CountryCode获取TimeZone,我使用了 NodaTime

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

我从此查询中获得TimeZoneID 我们可以根据CurrentDate and Time获得CountryCode的{​​{1}}吗?

2 个答案:

答案 0 :(得分:7)

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

// 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.
}

请记住,这假设某个国家/地区只有一个时区 - 并非总是如此。想想美国,那里有很多的时区......

答案 1 :(得分:2)

我用这个来得到日期:

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