Подтвердить что ты не робот

JodaTime эквивалент DateUtils.truncate()

Я никогда раньше не использовал JodaTime, но, отвечая на этот вопрос, Как получить порядковые будни через месяц.

Я попробовал и придумал этот уродливый код, чтобы отключить все поля ниже дня:

DateTime startOfMonth =
    input.withDayOfMonth(1)
        .withHourOfDay(0)       // there
        .withMinuteOfHour(0)    // has got to
        .withSecondOfMinute(0)  // be a shorter way
        .withMillisOfSecond(0); // to do this

Где эквивалент Commons/Lang с использованием DateUtils будет

Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);

Какая предпочтительная идиома для этого в JodaTime?

4b9b3361

Ответ 1

Вы можете использовать roundFloorCopy(), чтобы имитировать DateUtils.truncate

Date truncateMonth = DateUtils.truncate(input, Calendar.MONTH);
-> DateTime truncateMonth = input.dayOfMonth().roundFloorCopy();

Date truncateMinute = DateUtils.truncate(input, Calendar.MINUTE);
-> DateTime truncateMinute = input.minuteOfDay().roundFloorCopy();

Date truncateHourOfDay = DateUtils.truncate(input, Calendar.HOUR_OF_DAY);
-> DateTime truncateHourOfDay = input.hourOfDay().roundFloorCopy()

Ответ 2

Используйте метод withMillisOfDay() для сокращения синтаксиса.

DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0);

Ответ 3

Посмотрите DateMidnight.

DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1)));

Обновление: 2013-08-16 от JodaStephen: версия 2.3 Joda-Time осуждает DateMidnight, поскольку это была очень плохая идея класса.

Поэтому используйте:

DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay();

Ответ 4

Joda Time также поддерживает метод withFields в типе DateTime. Это также можно использовать для создания короткого синтаксиса:

new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0));

В производственном коде аргумент withFields должен быть заменен на константу.