I would like to round DateTime to the nearest 30 mins. Is there rounding mechanism provided in DART?
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
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With