Use DateUtils.truncate()
to throw out all fields less significant than the specified field.
When a Date
is truncated to the
Calendar.MONTH
field, DateUtils.truncate( )
will return a Date
object set to the first instance of the
month. The day, hour, minute, second, and millisecond field will each
contain the minimum possible value for that field. Example 1-9 truncates a date at the month
field and the hour field.
Example 1-9. Truncating a Date object at Calendar.MONTH
import org.apache.commons.lang.time.DateUtils; import org.apache.commons.lang.time.FastDateFormat; import org.apache.commons.lang.time.DateFormatUtils; FastDateFormat dtFormat = DateFormatUtils.ISO_DATETIME_FORMAT; Date now = new Date( ); Date truncatedMonth = DateUtils.truncate( now, Calendar.MONTH ); Date truncatedHour = DateUtils.truncate( now, Calendar.HOUR ); System.out.println( "Now: " + dtFormat.format( now ) ); System.out.println( "Truncated Month: " + dtFormat.format( truncatedMonth ) ); System.out.println( "Truncated Hour: " + dtFormat.format( truncatedHour ) );
Assuming that the current date is March 28, 2004, and the current time is 1:48 P.M., this example produces the following output:
Now: 2004-03-28T13:48:12 Truncated Month: 2004-03-01T00:00:00 Truncated Hour: 2004-03-28T13:00:00
If you want to associate every event that happened between 2 P.M.
and 3 P.M. with the 2 P.M. hour, or every event that happened in a
particular year with the first instant of that year, you need to
truncate a Date
at a specified
Calendar
field. When a Date
is truncated, it is rounded down;
DateUtils.truncate()
is the
equivalent of Math.floor( )
for the
Date
class. If it is 4:02 P.M. on
October 31, 1975, a Date
object
truncated at the Calendar.HOUR
field
will point to 4:00 P.M., and a Date
truncated at the Calendar.YEAR
field
will point to the first millisecond of the first minute, of the first
hour, of the first day of year 2005: January
01 2005: 12:00:00.000 A.M
.
DateUtils.truncate( )
can also
be used to truncate a date to the nearest DateUtils.SEMI_MONTH
. Recipe 1.14 discusses DateUtils.SEMI_MONTH
in more detail.