formatDateRangeText function

String formatDateRangeText(
  1. DateTime startTime,
  2. DateTime endTime,
  3. bool hasTimePicker, [
  4. IntlLocale? locale,
])

Gets a date range, startTime and endTime, and formats it's texts with locale, trying to use less characters.

Implementation

String formatDateRangeText(
    DateTime startTime, DateTime endTime, bool hasTimePicker,
    [IntlLocale? locale]) {
  locale ??= IntlLocale.getDefaultIntlLocale();

  var startFormat = getDateFormat_yMMMd();
  var endFormat = startFormat;

  var sameDay = false;

  if (startTime.year == endTime.year) {
    if (startTime.month == endTime.month) {
      if (startTime.day == endTime.day) {
        sameDay = true;
      } else {
        if (!startFormat.pattern!.startsWith('MMM') && !hasTimePicker) {
          startFormat = DateFormat('d', locale.code);
        } else {
          startFormat = DateFormat('MMMd', locale.code);
        }
      }
    } else {
      startFormat = DateFormat('MMMd', locale.code);
    }
  }

  var startText = startFormat.format(startTime);
  var endText = endFormat.format(endTime);

  var mergeDate = sameDay || startText == endText;

  var isFullDayTimeRange = startTime.hour == 0 &&
      startTime.minute == 0 &&
      endTime.hour == 23 &&
      endTime.minute == 59;

  var usesAMPM = getTimeFormatUsesAMPM(locale);

  var timeFormat =
      usesAMPM ? DateFormat('h:mm a', locale.code) : DateFormat.Hm();
  var timeGroupOpen = usesAMPM ? '' : '[';
  var timeGroupClose = usesAMPM ? '' : ']';

  var hasTimeText = hasTimePicker && !isFullDayTimeRange;

  String? timeStartText;
  String? timeEndText;

  if (hasTimeText) {
    timeStartText = timeFormat.format(startTime);
    timeEndText = timeFormat.format(endTime);
  }

  String? dateText;

  if (mergeDate) {
    dateText = startText;

    if (hasTimeText) {
      if (timeStartText == timeEndText) {
        dateText += ' $timeGroupOpen${timeStartText!}$timeGroupClose';
      } else {
        dateText +=
            ' $timeGroupOpen${timeStartText!} - ${timeEndText!}$timeGroupClose';
      }
    }
  } else {
    if (hasTimeText) {
      startText += ' $timeGroupOpen${timeStartText!}$timeGroupClose';
      endText += ' $timeGroupOpen${timeEndText!}$timeGroupClose';
    }

    dateText = '$startText - $endText';
  }

  return dateText;
}