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?
Ответы
Ответ 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
должен быть заменен на константу.