2015-08-11 5 views
1

Я знаю, есть метод DateTimeZone.AtStartOfDay, но есть ли аналоги, чтобы начать год/месяц? Я знаю, что самый простой способ Кодирую тех «первый день Х и 30 секунд» (который я сделал LocalDateTime start = LocalDateTime.FromDateTime(new DateTime(2014, 1, 1, 0, 0, 1, DateTimeKind.Utc));), но я думаю, что это далеко от передовой практикиКак получить «начало года/месяца» в NodaTime?

+0

Что вы ожидаете получить от 'AtStartOfYear/Month'? – WiiMaxx

+0

@WiiMaxx, чтобы получить соответствующее значение даты и времени. месяц особенно интересен, так как он имеет большую вероятность быть подверженным DST, чем начало года – chester89

+0

Почему вы сначала не задали свой 'ZonedDateTime' в первый день года/месяца, используя такие свойства, как DayOfYear (http://nodatime.org/1.3.x/api/html/P_NodaTime_ZonedDateTime_DayOfYear.htm), а затем вызвать 'DateTimeZone.AtStartOfDay'? –

ответ

3

Вы, конечно, не нужно идти через DateTime - но чтобы получить начало года в часовом поясе, я бы просто использовать:

var startOfYear = zone.AtStartOfDay(new LocalDate(year, 1, 1)); 

Обратите внимание, что это будет полезно, чтобы получить продолжительность между ZonedDateTime и началом года. Для периода (например, 5 месяцев, 2 дня, 3 часа) вам нужно просто использовать LocalDateTime, что не учитывает часовой пояс. (Период арифметика просто становится странно в лице часовых поясов ...)

Чтобы получить LocalDateTime вы можете просто использовать:

var startOfYear = new LocalDate(year, 1, 1).AtMidnight(); 

... хотя нет никакой гарантии, что эта дата/время произошло любой конкретный часовой пояс (или только один раз).

+0

Но использовать его в 'Period.Between (start, now, ...)' calls, должен ли я делать 'startOfYear.LocalDateTime' как предполагает документация? – chester89

+0

@ chester89: Нет, вы могли бы просто создать LocalDateTime для начала года. Именно поэтому я задал вам более подробные сведения по этому вопросу. Это действительно поможет, если вы представите примеры ввода и ожидаемого результата. –