TemporalTime.fromString constructor
TemporalTime.fromString(
- String iso8601String
Constructs a new TemporalTime from a ISO8601 string adhering to the format: hh:mm hh:mmZ hh:mm:ss hh:mm:ssZ hh:mm:ss.sss hh:mm:ss.sssZ without Z: +hh:mm +hh:mm:ss
Implementation
factory TemporalTime.fromString(String iso8601String) {
RegExp regExp = RegExp(
r'^([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 time string in the format '
'hh:mm:ss.sss with an optional time zone offset ±hh:mm:ss. '
'${Temporal.genericDocErrorMessage}',
);
}
// Remove Z
regexString = iso8601String.replaceAll(RegExp(r'(z|Z)'), '');
// Extract Time
var match = regExp.matchAsPrefix(regexString)!;
int hours = int.parse(match.group(1)!);
int minutes = int.parse(match.group(2)!);
int seconds = Temporal.getIntOr0(match.group(4));
int totalNanoseconds = Temporal.getIntOr0(match.group(6)?.padRight(9, '0'));
int milliseconds = totalNanoseconds ~/ 1000000;
int microseconds = (totalNanoseconds ~/ 1000) % 1000;
int nanoseconds = totalNanoseconds % 1000;
// Extract Offset
Duration? offset;
if (match.group(7) != null && match.group(7)!.isNotEmpty) {
offset = Temporal.offsetToDuration(match.group(7)!);
} else if (iso8601String.toLowerCase().contains('z')) {
offset = const Duration();
}
return TemporalTime._(
DateTime.utc(
1970,
1,
1,
hours,
minutes,
seconds,
milliseconds,
microseconds,
),
nanoseconds: nanoseconds,
offset: offset,
);
}