[英]NodaTime get Country Time based on CountryCode
我有一個要求,管理員將為該國家/地區列表的用戶選擇一些countries List
和Time 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
計算India
的Time to Alert
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
基礎上, 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.