Search code examples
javadatetimejodatime

How to round DateTime of Joda library to the nearest X minutes?


How to round DateTime of Joda library to the nearest X minutes ?
For example:

X = 10 minutes
Jun 27, 11:32 -> Jun 27, 11:30
Jun 27, 11:33 -> Jun 27, 11:30
Jun 27, 11:34 -> Jun 27, 11:30
Jun 27, 11:35 -> Jun 27, 11:40
Jun 27, 11:36 -> Jun 27, 11:40
Jun 27, 11:37 -> Jun 27, 11:40

Solution

  • The original accepted answer doesn't correctly handle datetimes that have seconds or milliseconds set. For completeness, here's a version that does handle that correctly:

    private DateTime roundDate(final DateTime dateTime, final int minutes) {
        if (minutes < 1 || 60 % minutes != 0) {
            throw new IllegalArgumentException("minutes must be a factor of 60");
        }
    
        final DateTime hour = dateTime.hourOfDay().roundFloorCopy();
        final long millisSinceHour = new Duration(hour, dateTime).getMillis();
        final int roundedMinutes = ((int)Math.round(
            millisSinceHour / 60000.0 / minutes)) * minutes;
        return hour.plusMinutes(roundedMinutes);
    }