alignDateTime method
Returns a new DateTime aligned to the specified alignment duration.
If shouldRoundUp is true, the result is rounded up to the next
alignment boundary. Defaults to rounding down.
Implementation
@useResult
DateTime alignDateTime({
required Duration alignment,
bool shouldRoundUp = false,
}) {
if (alignment == Duration.zero) {
return this;
}
final int hours;
if (alignment.inDays > 0) {
hours = hour;
} else {
hours = alignment.inHours > 0 ? hour % alignment.inHours : 0;
}
int minutes;
if (alignment.inHours > 0) {
minutes = minute;
} else {
minutes = alignment.inMinutes > 0 ? minute % alignment.inMinutes : 0;
}
int seconds;
if (alignment.inMinutes > 0) {
seconds = second;
} else {
seconds = alignment.inSeconds > 0 ? second % alignment.inSeconds : 0;
}
int milliseconds;
if (alignment.inSeconds > 0) {
milliseconds = millisecond;
} else {
milliseconds = alignment.inMilliseconds > 0 ? millisecond % alignment.inMilliseconds : 0;
}
final int microseconds = alignment.inMilliseconds > 0 ? microsecond : 0;
final Duration correction = Duration(
hours: hours,
minutes: minutes,
seconds: seconds,
milliseconds: milliseconds,
microseconds: microseconds,
);
if (correction == Duration.zero) {
return this;
}
final DateTime corrected = subtract(correction);
return shouldRoundUp ? corrected.add(alignment) : corrected;
}