alignDateTime method

  1. @useResult
DateTime alignDateTime({
  1. required Duration alignment,
  2. bool shouldRoundUp = false,
})

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;
}