2016-01-08 3 views
0

У меня есть метод, который должен возвращать время начала рабочего дня, например. 9 утра из ZonedDateTime, что он принимает в качестве параметра:Как правильно установить компонент времени ZonedDateTime в Nodatime

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) => (zdt.Zone.AtStartOfDay(zdt.Date).Date + WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver); 

WorkDayStartTime является new LocalTime(9, 0)

CommonLenientResolver обычай распознаватель, увидеть реализацию на Comparing LocalDateTime for Different Time Zones in Nodatime

Так что для любого конкретного ZDT, я бы например, чтобы быть уверенным, что возвращаемое значение всегда равно 9AM дня, которое представляет параметр zdt.

Как указано в документации AtStartOfDay (...), если в полночь дня, когда часы не существуют (например, часы перемещаются вперед в полночь прямо к 1AM), Nodatime автоматически будет использовать следующий доступный экземпляр , 1 ЧАС НОЧИ. В моей текущей реализации я добавляю 9 часов в AtStartOfDay (...), поэтому, если начало дня - 1 утра, мой GetWorkStartTime (...) вернет 10 утра, что я хотел бы избежать.

Я использую Nodatime 1.3.1.

ответ

2

Похоже, что вам не нужно использовать AtStartOfDay вообще - просто использовать дату и добавить свой WorkDayStartTime:

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) => 
    (zdt.Date + WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver); 

Или, если вы найдете его более ясным:

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) => 
    zdt.Date.At(WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver); 

Если предположить, что resolver обрабатывает все так, как вы хотите, для пропущенных/неоднозначных значений, это должно быть хорошо.