Sean Patrick Floyd
Sean Patrick Floyd

Reputation: 299178

JodaTime equivalent of DateUtils.truncate()

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

Answers (4)

Erick Robertson
Erick Robertson

Reputation: 33082

Use the withMillisOfDay() method to shorten the syntax.

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

Upvotes: 43

SpaceTrucker
SpaceTrucker

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

Bozho
Bozho

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

Soundlink
Soundlink

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

Related Questions