У меня есть требование, когда Admin выберет некоторые countries List
и Time for Alert
для пользователей для этого списка стран.
Позволяет сказать, что администратор выбирает 24/07/2014 09:00 AM
в странах India,Malaysia and Canada
Им необходимо получить оповещения на основе their TimeZone
и каждый пользователь страны должен получить предупреждение в User Local 9 AM Time
.
Итак, у меня есть только country Codes
такие как IN, MY, CA
Итак, я думал о получении их TimeZones и вычислении на основе Server Time
.
Например: Мой сервер находится в Canada
, я подумал о том, как рассчитывать Time to Alert
в India
на основе India TimeZone
и save the Time in Db
что моя служба Windows будет работать в это время Индии и нажать Alert.
Но для этого мне нужно сохранить несколько записей с разными временами в Db.
Итак, для получения TimeZone
основе CountryCode я использовал 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 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 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();
IClock.Now
возвращаетInstant
, которое не относится ни к какомуIClock.Now
поясу (или календарю). Но, по сути, если вы знаете только чью-то страну, вы не можете точно указать их часовой пояс.