Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 
like image 812
Michael Avatar asked Jun 27 '12 08:06

Michael


2 Answers

The 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); } 
like image 144
Mark Byers Avatar answered Sep 21 '22 12:09

Mark Byers


Using pure DateTime (Joda) Java Library:

DateTime dt = new DateTime(1385577373517L, DateTimeZone.UTC); // Prints 2013-11-27T18:36:13.517Z System.out.println(dt);  // Prints 2013-11-27T18:36:00.000Z (Floor rounded to a minute) System.out.println(dt.minuteOfDay().roundFloorCopy());  // Prints 2013-11-27T18:30:00.000Z (Rounded to custom minute Window) int windowMinutes = 10; System.out.println(     dt.withMinuteOfHour((dt.getMinuteOfHour() / windowMinutes) * windowMinutes)         .minuteOfDay().roundFloorCopy()     ); 
like image 22
vladaman Avatar answered Sep 19 '22 12:09

vladaman