tryParse static method

Hora? tryParse(
  1. String input,
  2. String format, {
  3. HoraLocale? locale,
  4. bool strict = false,
})

Tries to parse a date string, returns null if parsing fails.

Implementation

static Hora? tryParse(
  String input,
  String format, {
  HoraLocale? locale,
  bool strict = false,
}) {
  locale ??= Hora.globalLocale;

  try {
    final result = _parseWithFormat(input, format, locale, strict);
    if (result == null) return null;
    if (!result.hasParsedToken) return null;

    // Handle 12-hour format
    var adjustedHour = result.hour ?? 0;
    if (result.is12Hour && result.hour != null) {
      if (result.isPM && adjustedHour < 12) {
        adjustedHour += 12;
      } else if (!result.isPM && adjustedHour == 12) {
        adjustedHour = 0;
      }
    }

    if (!_validateParsedComponents(result, adjustedHour)) {
      return null;
    }

    final resolvedYear = result.year ?? DateTime.now().year;
    final resolvedMonth = result.month ?? 1;
    final resolvedDay = result.day ?? 1;
    final resolvedMinute = result.minute ?? 0;
    final resolvedSecond = result.second ?? 0;
    final resolvedMillisecond = result.millisecond ?? 0;

    // When a timezone offset is provided (including +00:00 / Z),
    // build UTC time first, then apply parsed offset.
    if (result.tzOffsetMinutes != null) {
      final utcDt = DateTime.utc(
        resolvedYear,
        resolvedMonth,
        resolvedDay,
        adjustedHour,
        resolvedMinute,
        resolvedSecond,
        resolvedMillisecond,
      ).subtract(Duration(minutes: result.tzOffsetMinutes!));
      return Hora.fromDateTime(utcDt, locale: locale);
    }

    return Hora.of(
      year: resolvedYear,
      month: resolvedMonth,
      day: resolvedDay,
      hour: adjustedHour,
      minute: resolvedMinute,
      second: resolvedSecond,
      millisecond: resolvedMillisecond,
      utc: result.isUtc,
      locale: locale,
    );
  } catch (_) {
    return null;
  }
}