TemporalDate.fromString constructor

TemporalDate.fromString(
  1. String iso8601String
)

Constructs a new TemporalDate from a ISO8601 string adhering to the format: YYYY-MM-DD YYYY-MM-DDZ without Z: +hh:mm +hh:mm:ss

Implementation

factory TemporalDate.fromString(String iso8601String) {
  // TODO: enforce month 1-12
  RegExp regExp = RegExp(
      r'^([0-9]{4}-[0-1][0-9]-[0-3][0-9])((z|Z)|((\+|-)[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?))?',
      caseSensitive: false,
      multiLine: false);

  // Validate
  String? regexString = regExp.stringMatch(iso8601String);
  if (regexString == null || regexString != iso8601String) {
    throw const AmplifyException(
      'Invalid ISO8601 String Input',
      recoverySuggestion:
          'Please provide an extended ISO 8601 date string in the format '
          'YYYY-MM-DD with an optional time zone offset ±hh:mm:ss. '
          '${Temporal.genericDocErrorMessage}',
    );
  }

  // Remove Z
  regexString = iso8601String.replaceAll(RegExp(r'(z|Z)'), '');

  // Extract Date
  var match = regExp.matchAsPrefix(regexString)!;

  // Parse cannot take a YYYY-MM-DD as UTC!
  DateTime dateTime = DateTime.parse(match.group(1)!);
  dateTime = DateTime.utc(dateTime.year, dateTime.month, dateTime.day);

  // Extract Offset
  Duration? offset;
  if (match.group(2) != null && match.group(2)!.isNotEmpty) {
    offset = Temporal.offsetToDuration(match.group(2)!);
  } else if (iso8601String.toLowerCase().contains('z')) {
    offset = const Duration();
  }

  return TemporalDate._(dateTime, offset);
}