tryParse static method

XPathDateTime? tryParse(
  1. String value, [
  2. XPathType type = xsDateTime
])

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);
}