Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Round up the Date-Time nearest to 30 min interval in DART (Flutter)?

I would like to round DateTime to the nearest 30 mins. Is there rounding mechanism provided in DART?

like image 683
Niraj Avatar asked Nov 07 '25 18:11

Niraj


2 Answers

I had a similar problem today and but it was to clamp to the next 15 mins.

DateTime nearestQuarter(DateTime val) {
  return DateTime(val.year, val.month, val.day, val.hour,
    15, 30, 45, 60][(val.minute / 15).floor()]);
}

or in your case

DateTime nearestHalf(DateTime val) {
  return DateTime(val.year, val.month, val.day, val.hour,
    [30, 60][(val.minute / 30).floor()]);
}

I just noticed you said 'nearest half hour'

DateTime nearestHalf(DateTime val) {
  return DateTime(val.year, val.month, val.day, val.hour,
    [0, 30, 60][(val.minute / 30).round()]);
}

https://francescocirillo.com/pages/anti-if-campaign

like image 179
Kyristopher Avatar answered Nov 09 '25 10:11

Kyristopher


You can use this function to roundup the time.

DateTime alignDateTime(DateTime dt, Duration alignment,
    [bool roundUp = false]) {
  assert(alignment >= Duration.zero);
  if (alignment == Duration.zero) return dt;
  final correction = Duration(
      days: 0,
      hours: alignment.inDays > 0
          ? dt.hour
          : alignment.inHours > 0
              ? dt.hour % alignment.inHours
              : 0,
      minutes: alignment.inHours > 0
          ? dt.minute
          : alignment.inMinutes > 0
              ? dt.minute % alignment.inMinutes
              : 0,
      seconds: alignment.inMinutes > 0
          ? dt.second
          : alignment.inSeconds > 0
              ? dt.second % alignment.inSeconds
              : 0,
      milliseconds: alignment.inSeconds > 0
          ? dt.millisecond
          : alignment.inMilliseconds > 0
              ? dt.millisecond % alignment.inMilliseconds
              : 0,
      microseconds: alignment.inMilliseconds > 0 ? dt.microsecond : 0);
  if (correction == Duration.zero) return dt;
  final corrected = dt.subtract(correction);
  final result = roundUp ? corrected.add(alignment) : corrected;
  return result;
}

and then use it the following way

void main() {
  DateTime dt = DateTime.now();
  var newDate = alignDateTime(dt,Duration(minutes:30));
  print(dt);  // prints 2022-01-07 15:35:56.288
  print(newDate); // prints 2022-01-07 15:30:00.000
}
like image 28
prasadsunny1 Avatar answered Nov 09 '25 08:11

prasadsunny1