簡體   English   中英

NodaTime根據CountryCode獲取國家時間

[英]NodaTime get Country Time based on CountryCode

我有一個要求,管理員將為該國家/地區列表的用戶選擇一些countries ListTime for Alert

假設管理員在India,Malaysia and Canada的國家/ India,Malaysia and Canada選擇了24/07/2014 09:00 AM ,他們需要根據their TimeZone獲取警報,每個國家/地區的用戶都需要在User's Local 9 AM Time獲取警報。

因此,我只有他們的country Codes例如IN,MY,CA

因此,我想到了獲取其TimeZones並根據Server Time計算。

例如:我的服務器位於Canada 。因此,我想到了基於India TimeZone計算IndiaTime to Alert save the Time in Db 。因此,我的Windows服務將在該印度時間運行並推送警報。

但是為此,我需要在Db中保存多個具有不同時間的記錄。

因此,為了獲得基於CountryCodeTimeZone ,我使用了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基礎上, Admin's Selected DateTime

您的代碼幾乎是正確的-盡管可以對其進行某種程度的簡化並使其更具可測試性,並且它應該處理沒有此類區域的情況...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM