NodaTime получает время страны на основе кода страны

1

У меня есть требование, когда 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?

Теги:
datetime
utc
nodatime

2 ответа

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

Имейте в виду, что это предполагает наличие только одного часового пояса для страны - это не всегда так. Подумайте о США, где есть много часовых поясов...

  • 0
    Спасибо за предложение @Jon Skeet. Как я уже заметил, SystemClock. Экземпляр выдает UtcNow, верно? Можете ли вы также посмотреть на мое требование и дать мне какие-либо предложения. Потому что я чувствую, что я делаю неправильно, чтобы сохранить несколько записей для стран и отправки через службу Windows.
  • 1
    @RealSteel: Ну, IClock.Now возвращает Instant , которое не относится ни к какому IClock.Now поясу (или календарю). Но, по сути, если вы знаете только чью-то страну, вы не можете точно указать их часовой пояс.
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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню