Spec-Zone.ru › Dart 2

dart:core

Метод parse

DateTime parse(
  1. 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.18.5/dart-core/DateTime/parse.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API