TemporalDateTime.fromString constructor
TemporalDateTime.fromString(
- 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,
);
}