Определите, как рассчитать время в разных часовых поясах, используя nodaTime и withZone для ZoneDateTime

При конвертации времени между часовыми поясами. Я нашел следующий код работает. Однако я не уверен, как программно, что положить в качестве моего смещения для конструктора для ZonedDateTime, У меня был выбор одного из смещений на zoneChicago, который равен двум, потому что он либо с нашим без летнего времени, но как узнать, какой из них я использую, и для часовых поясов, которые имеют более двух, что лучше способ заполнить это смещение?

Спасибо,

Джим

var zoneLA      = c.GetZoneOrNull("America/Los_Angeles");
var zoneChicago = c.GetZoneOrNull("America/Chicago");

var zdtChicago = new ZonedDateTime( LocalDateTime.FromDateTime(DateTime.Now)
                                  , zoneChicago
                                  , zoneChicago.MaxOffset);

var zdtLA = zdtChicago.WithZone(zoneLA);

1 ответ

Если вас интересует текущее время, вы можете сделать это намного проще - и даже более тестируемым. Заставь свой код взять IClock как "сервис по предоставлению текущего момента времени". Для конкретной реализации используйте SystemClock.Instance в производстве, но FakeClock для тестирования.

IClock имеет одного члена: Now, Это возвращает текущий Instant во времени, которое не привязано к часовому поясу или даже к календарной системе.

С Instant и часовой пояс, вы можете легко добраться до ZonedDateTime:

Instant now = clock.Now;
var zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"];
ZonedDateTime = now.InZone(zone);

Это будет работать, каковы локальные дата / время и смещение. Вам не нужно делать ничего умного:)

Другие вопросы по тегам