Reputation: 299178
I have never used JodaTime before, but answering this question, How to get ordinal Weekdays in a Month.
I tried it and came up with this ugly code to unset all fields below day:
DateTime startOfMonth =
input.withDayOfMonth(1)
.withHourOfDay(0) // there
.withMinuteOfHour(0) // has got to
.withSecondOfMinute(0) // be a shorter way
.withMillisOfSecond(0); // to do this
Where the Commons / Lang equivalent using DateUtils would be
Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);
What's the preferred idiom to do that in JodaTime?
Upvotes: 46
Views: 28693
Reputation: 33082
Use the withMillisOfDay()
method to shorten the syntax.
DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0);
Upvotes: 43
Reputation: 13556
Joda Time also supports the withFields method in the DateTime
type. This can also be used to create a short syntax:
new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0));
In production code the argument to withFields
should be factored out to a constant.
Upvotes: 1
Reputation: 597362
Take a look at DateMidnight
.
DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1)));
Update: 2013-08-16 by JodaStephen: Version 2.3 of Joda-Time deprecates DateMidnight
as it was a very bad idea of a class.
So use:
DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay();
Upvotes: 21
Reputation: 3931
You can use roundFloorCopy() to mimic 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()
Upvotes: 46