TemporalDate.fromString constructor
TemporalDate.fromString(
- 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(fjnoyp): enforce month 1-12
final 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
var regexString = regExp.stringMatch(iso8601String);
if (regexString == null || regexString != iso8601String) {
throw const FormatException(
'Invalid ISO8601 String Input\n\n'
'Please provide an extended ISO 8601 date string in the format '
'YYYY-MM-DD with an optional time zone offset \u00b1hh:mm:ss. '
'${Temporal.genericDocErrorMessage}',
);
}
// Remove Z
regexString = iso8601String.replaceAll(RegExp(r'(z|Z)'), '');
// Extract Date
final match = regExp.matchAsPrefix(regexString)!;
// Parse cannot take a YYYY-MM-DD as UTC!
var 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 = Duration.zero;
}
return TemporalDate._(dateTime, offset);
}