tryParse static method
Attempts to parse a string representation of a date/time.
Implementation
static XPathDateTime? tryParse(String value, [XPathType type = xsDateTime]) {
if (type == xsDate) return tryParseDate(value);
if (type == xsTime) return tryParseTime(value);
if (type == xsGYearMonth) return tryParseYearMonth(value);
if (type == xsGYear) return tryParseYear(value);
if (type == xsGMonthDay) return tryParseMonthDay(value);
if (type == xsGMonth) return tryParseMonth(value);
if (type == xsGDay) return tryParseDay(value);
final match = _dateTimeRegExp.firstMatch(value);
if (match == null) return null;
final tzStr = match.namedGroup('timezone');
final offset = _parseTimezoneOffsetMinutes(tzStr);
if (tzStr != null && offset == null) return null;
if (type == xsDateTimeStamp && offset == null) return null;
final yr = int.tryParse(match.namedGroup('year') ?? '');
if (yr == null) return null;
final mo = int.tryParse(match.namedGroup('month') ?? '');
if (mo == null) return null;
final dy = int.tryParse(match.namedGroup('day') ?? '');
if (dy == null) return null;
final hr = int.tryParse(match.namedGroup('hour') ?? '');
if (hr == null) return null;
final mn = int.tryParse(match.namedGroup('minute') ?? '');
if (mn == null) return null;
final scDouble = double.tryParse(match.namedGroup('second') ?? '');
if (scDouble == null) return null;
final sc = scDouble.truncate();
final frac = scDouble - sc;
final ms = (frac * 1000).truncate();
final us = ((frac * 1000000) - (ms * 1000)).round();
if (!_validateDateTime(yr, mo, dy, hr, mn, scDouble)) return null;
if (hr == 24) {
final normalizedDate = DateTime.utc(
yr,
mo,
dy,
).add(const Duration(days: 1));
return XPathDateTime(
normalizedDate.year,
normalizedDate.month,
normalizedDate.day,
0,
0,
0,
0,
0,
offset,
type,
);
}
return XPathDateTime(yr, mo, dy, hr, mn, sc, ms, us, offset, type);
}