статический метод parse
- String formattedString
Создает новый экземпляр DateTime на основе formattedString.
Выбрасывает исключение FormatException, если входную строку невозможно разобрать.
Функция разбирает подмножество ISO 8601, включающее подмножество, принимаемое RFC 3339.
В настоящее время принимаются следующие входные данные:
- Дата: год со знаком, состоящий из четырех-шести цифр, двухзначный месяц и двухзначный день; компоненты могут быть разделены символами
-. Примеры: "19700101", "-0004-12-24", "81030-04-01". - Необязательная часть времени, отделенная от даты символом
Tили пробелом. Часть времени содержит двухзначное значение часа, затем необязательное двухзначное значение минут, затем необязательное двухзначное значение секунд и необязательную дробную часть секунды, состоящую как минимум из одной цифры и предваряемую символом '.' или ','. Минуты и секунды могут быть отделены от предыдущих частей символом ':'. Примеры: "12", "12:30:24.124", "12:30:24,124", "123010.50". - Необязательная часть со смещением часового пояса, которая может быть отделена от предыдущей части пробелом. Часовой пояс обозначается символом 'z' или 'Z' либо знаком и двухзначным значением часа с необязательным двухзначным значением минут. Знак должен быть либо "+" либо "-", его нельзя опустить. Минуты могут быть отделены от часов символом ':'. Примеры: "Z", "-10", "+01:30", "+1130".
Сюда входят результаты вызова как toString, так и toIso8601String; они будут разобраны обратно в объект DateTime с тем же временем, что и исходный объект.
Результат всегда представляется в местном времени или UTC. Если указано смещение часового пояса, отличное от UTC, время преобразуется в соответствующее время UTC.
Примеры принимаемых строк:
"2012-02-27""2012-02-27 13:27:00""2012-02-27 13:27:00.123456789z""2012-02-27 13:27:00,123456789z""20120227 13:27:00""20120227T132700""20120227""+20120227""2012-02-27T14Z""2012-02-27T14+00:00"-
"-123450101 00:00:00 Z": в году -12345. -
"2002-02-27T14:00:00-0500": то же, что и"2002-02-27T19:00:00Z"
Этот метод принимает значения компонентов, выходящие за допустимые пределы, и интерпретирует их как переполнение в следующую более крупную компоненту. Например, "2020-01-42" будет разобрана как 2020-02-11, поскольку последняя допустимая дата в этом месяце — 2020-01-31, поэтому 42 дня интерпретируются как 31 день этого месяца плюс 11 дней следующего месяца.
Чтобы обнаруживать и отклонять недопустимые значения компонентов, используйте DateFormat.parseStrict из пакета intl.
Реализация
static DateTime parse(String formattedString) {
var re = _parseFormat;
Match? match = re.firstMatch(formattedString);
if (match != null) {
int parseIntOrZero(String? matched) {
if (matched == null) return 0;
return int.parse(matched);
}
// Parses fractional second digits of '.(\d+)' into the combined
// microseconds. We only use the first 6 digits because of DateTime
// precision of 999 milliseconds and 999 microseconds.
int parseMilliAndMicroseconds(String? matched) {
if (matched == null) return 0;
int length = matched.length;
assert(length >= 1);
int result = 0;
for (int i = 0; i < 6; i++) {
result *= 10;
if (i < matched.length) {
result += matched.codeUnitAt(i) ^ 0x30;
}
}
return result;
}
int years = int.parse(match[1]!);
int month = int.parse(match[2]!);
int day = int.parse(match[3]!);
int hour = parseIntOrZero(match[4]);
int minute = parseIntOrZero(match[5]);
int second = parseIntOrZero(match[6]);
int milliAndMicroseconds = parseMilliAndMicroseconds(match[7]);
int millisecond =
milliAndMicroseconds ~/ Duration.microsecondsPerMillisecond;
int microsecond = milliAndMicroseconds
.remainder(Duration.microsecondsPerMillisecond) as int;
bool isUtc = false;
if (match[8] != null) {
// timezone part
isUtc = true;
String? tzSign = match[9];
if (tzSign != null) {
// timezone other than 'Z' and 'z'.
int sign = (tzSign == '-') ? -1 : 1;
int hourDifference = int.parse(match[10]!);
int minuteDifference = parseIntOrZero(match[11]);
minuteDifference += 60 * hourDifference;
minute -= sign * minuteDifference;
}
}
int? value = _brokenDownDateToValue(years, month, day, hour, minute,
second, millisecond, microsecond, isUtc);
if (value == null) {
throw FormatException("Time out of range", formattedString);
}
return DateTime._withValue(value, isUtc: isUtc);
} else {
throw FormatException("Invalid date format", formattedString);
}
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-core/DateTime/parse.html