alignDateTime method

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

Aligns the current DateTime to the specified duration.

Args: alignment (Duration): The duration to align to. roundUp (bool): If true, the DateTime is rounded up to the next alignment. Defaults to false.

Returns: DateTime: A new DateTime object aligned to the specified duration.

Implementation

DateTime alignDateTime({required Duration alignment, bool roundUp = false}) {
  // ref: https://stackoverflow.com/questions/60880315/how-to-round-up-the-date-time-nearest-to-30-min-interval-in-dart-flutter
  if (alignment == Duration.zero) {
    return this;
  }

  final Duration correction = Duration(
    //days: 0,
    hours: alignment.inDays > 0
        ? hour
        : alignment.inHours > 0
        ? hour % alignment.inHours
        : 0,
    minutes: alignment.inHours > 0
        ? minute
        : alignment.inMinutes > 0
        ? minute % alignment.inMinutes
        : 0,
    seconds: alignment.inMinutes > 0
        ? second
        : alignment.inSeconds > 0
        ? second % alignment.inSeconds
        : 0,
    milliseconds: alignment.inSeconds > 0
        ? millisecond
        : alignment.inMilliseconds > 0
        ? millisecond % alignment.inMilliseconds
        : 0,
    microseconds: alignment.inMilliseconds > 0 ? microsecond : 0,
  );

  if (correction == Duration.zero) {
    return this;
  }

  final DateTime corrected = subtract(correction);

  return roundUp ? corrected.add(alignment) : corrected;
}