TemporalDateTime.fromString constructor

TemporalDateTime.fromString(
  1. String iso8601String
)

Constructs a new TemporalDate from a ISO8601 string adhering to the format: NOTE: Z or an offset is required YYYY-MM-DDThh:mmZ YYYY-MM-DDThh:mm:ssZ YYYY-MM-DDThh:mm:ss.sssZ without Z: +hh:mm +hh:mm:ss

Implementation

factory TemporalDateTime.fromString(String iso8601String) {
  RegExp regExp = RegExp(
      r'^([0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9](:[0-5][0-9](\.([0-9]{1,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 datetime string in the format '
          'YYYY-MM-DDThh:mm:ss with an optional time zone offset ±hh:mm:ss.  '
          '${Temporal.genericDocErrorMessage}',
    );
  }

  if (regexString != iso8601String) {
    throw Exception('invalid string input');
  }

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

  // Parse cannot take a YYYY-MM-DD as UTC!
  DateTime dateTime = DateTime.parse(match.group(1)!.split('.')[0]);

  int totalNanoseconds = Temporal.getIntOr0(match.group(4)?.padRight(9, '0'));
  int milliseconds = totalNanoseconds ~/ 1000000;
  int microseconds = (totalNanoseconds ~/ 1000) % 1000;
  int nanoseconds = totalNanoseconds % 1000;

  dateTime = DateTime.utc(
    dateTime.year,
    dateTime.month,
    dateTime.day,
    dateTime.hour,
    dateTime.minute,
    dateTime.second,
    milliseconds,
    microseconds,
  );

  Duration? offset;
  if (match.group(7) != null && match.group(7)!.isNotEmpty) {
    offset = Temporal.offsetToDuration(match.group(7)!);
  } else {
    offset = const Duration();
  }

  return TemporalDateTime._(
    dateTime,
    nanoseconds: nanoseconds,
    offset: offset,
  );
}