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

2

При конвертации времени между часовыми поясами. Я нашел следующий код работает. Однако я не уверен, как программно, что положить в качестве моего смещения для конструктора для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);
Посмотрим на это, когда у меня будет время - скоро обещаю! Вероятно, стоит переместить ваш комментарий в вопрос для удобства чтения. Jon Skeet
Хорошо, попробовал это, не уверен, что это правильно:var zoneLA = c.GetZoneOrNull("America/Los_Angeles"); var zoneChicago = c.GetZoneOrNull("America/Chicago"); var now = DateTime.Now; var iNow = Instant.FromDateTimeUtc(now.ToUniversalTime()); var zdtChicago = new ZonedDateTime(LocalDateTime.FromDateTime(now), zoneChicago, zoneChicago.GetZoneInterval(iNow).WallOffset); var zdtLA = zdtChicago.WithZone(zoneLA); Jim

Ваш Ответ

1   ответ
3

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

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

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

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

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

Похожие вопросы