tryParse static method
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;
}
}