Я знаю, есть метод DateTimeZone.AtStartOfDay
, но есть ли аналоги, чтобы начать год/месяц? Я знаю, что самый простой способ Кодирую тех «первый день Х и 30 секунд» (который я сделал LocalDateTime start = LocalDateTime.FromDateTime(new DateTime(2014, 1, 1, 0, 0, 1, DateTimeKind.Utc));
), но я думаю, что это далеко от передовой практикиКак получить «начало года/месяца» в NodaTime?
ответ
Вы, конечно, не нужно идти через DateTime
- но чтобы получить начало года в часовом поясе, я бы просто использовать:
var startOfYear = zone.AtStartOfDay(new LocalDate(year, 1, 1));
Обратите внимание, что это будет полезно, чтобы получить продолжительность между ZonedDateTime
и началом года. Для периода (например, 5 месяцев, 2 дня, 3 часа) вам нужно просто использовать LocalDateTime
, что не учитывает часовой пояс. (Период арифметика просто становится странно в лице часовых поясов ...)
Чтобы получить LocalDateTime
вы можете просто использовать:
var startOfYear = new LocalDate(year, 1, 1).AtMidnight();
... хотя нет никакой гарантии, что эта дата/время произошло любой конкретный часовой пояс (или только один раз).
Но использовать его в 'Period.Between (start, now, ...)' calls, должен ли я делать 'startOfYear.LocalDateTime' как предполагает документация? – chester89
@ chester89: Нет, вы могли бы просто создать LocalDateTime для начала года. Именно поэтому я задал вам более подробные сведения по этому вопросу. Это действительно поможет, если вы представите примеры ввода и ожидаемого результата. –
Что вы ожидаете получить от 'AtStartOfYear/Month'? – WiiMaxx
@WiiMaxx, чтобы получить соответствующее значение даты и времени. месяц особенно интересен, так как он имеет большую вероятность быть подверженным DST, чем начало года – chester89
Почему вы сначала не задали свой 'ZonedDateTime' в первый день года/месяца, используя такие свойства, как DayOfYear (http://nodatime.org/1.3.x/api/html/P_NodaTime_ZonedDateTime_DayOfYear.htm), а затем вызвать 'DateTimeZone.AtStartOfDay'? –