Search code examples
javaandroiddatetimejodatimedst

Correct way to use periods for daylight saving with the help of Joda Time


I am getting incorrect results because of the daylight savings for that day.

I used,

Calendar todays = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
todays.set(Calendar.HOUR_OF_DAY, 24);
todays.set(Calendar.MINUTE, 0);
todays.set(Calendar.SECOND, 0);
todays.set(Calendar.MILLISECOND, 0);

As mentioned in Joda-Time doc,

Consider adding 1 day at the daylight savings boundary. If you use a period to do the addition then either 23 or 25 hours will be added as appropriate. If you had created a duration equal to 24 hours, then you would end up with the wrong result.

I didn't found any example of how to implement such a period using Joda-Time.

So, I want to get the number of hours contained in each day dynamically rather hard coding it with 24 hours as mentioned.


Solution

  • The simplest approach is probably to use something like:

    public int getHoursInDay(LocalDate date, DateTimeZone zone) {
        DateTime start = date.toDateTimeAtStartOfDay(zone);
        DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
        return new Duration(start, end).getStandardHours();
    }
    

    EDIT: If you're using a version of Joda Time which doesn't support Duration.getStandardHours() you could use:

    public int getHoursInDay(LocalDate date, DateTimeZone zone) {
        DateTime start = date.toDateTimeAtStartOfDay(zone);
        DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
        long millis = new Duration(start, end).getMillis();
        return (int) (millis / DateTimeConstants.MILLIS_PER_HOUR);
    }