2012-02-05 2 views
40

Я хочу создать интервал между началом недели и концом текущей недели.Jodatime начало дня и конца дня

У меня есть следующий код, заимствованный из this answer:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) { 
     d = d.plusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(LocalDateTime d) { 
    if (d.getDayOfWeek() < DateTimeConstants.MONDAY) { 
     d = d.minusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.MONDAY); 
} 

Но теперь я хочу, чтобы понедельник LocalDateTime быть в 00:00:00, а воскресенье LocalDateTime в 23:59:59. Как мне это сделать?

ответ

20

Как насчет:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    return d.withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(final LocalDateTime d) { 
    return d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withDayOfWeek(DateTimeConstants.MONDAY); 
} 
+4

'setXxx' по соглашению не имеет тип возвращаемого значения в Java, так что не допустит сцепления. Это здесь напоминает шаблон построителя (который изначально не работал бы с существующим объектом). –

+1

Действительно. Это позволяет вам объединять вызовы вместе, а не иметь их всех на разных линиях и получать все преимущества неизменяемых объектов. –

+0

Я думаю, что «шаблон» называется «Свободный интерфейс» http://martinfowler.com/bliki/FluentInterface.html - дает много преимуществ в читаемости и ясности, на мой взгляд. –

127

Вы можете использовать withTime метод:

d.withTime(0, 0, 0, 0); 
d.withTime(23, 59, 59, 999); 

То же ответ Питера, но короче.

+39

Начало дня также можно получить с помощью _d.withTimeAtStartOfDay() _ – Touko

+12

'withTimeAtStartOfDay()' недоступен для 'LocalDateTime', но он доступен для [' DateTime'] (http: //joda-time.sourceforge .net/apidocs/org/joda/time/DateTime.html # withTimeAtStartOfDay()) – Abdull

+0

+1. Одна заметка: «LocalDateTime неизменен, поэтому нет установленных методов. Вместо этого этот метод возвращает новый экземпляр с изменением значения миллиса дня. «Поэтому вам нужно назначить результат некоторой переменной. – informatik01

65

также простой способ

d.millisOfDay().withMaximumValue();

+10

Это должен быть принятый ответ, по сравнению с другими ответами - лучший с точки зрения производительности (меньше объектов, созданных как DateTime, не поддаются обработке). Метод withMaximunValue Documentation даже говорит, что это лучший способ выполнить то, что задает вопрос. – le0diaz

+0

В чем разница с 'getMaximumValueOverall'? –

Смежные вопросы