String даты синтаксического анализа Rust Chrono, ParseError (NotEnough) и ParseError (TooShort)

Как преобразовать строку в chrono::DateTime или chrono::NaiveDateTime

А что означает ParseError(NotEnough) или ParseError(TooShort)?

1 ответ

При преобразовании String в объект Chrono вы должны знать, какие части имеет формат ввода строки.
Это следующие части: Дата, Время,
Примеры часового пояса:

  • "2020-04-12" => Дата = NaiveDate
  • "22:10" => Время = NaiveTime
  • "2020-04-12 22:10:57" => Дата + Время = NaiveDateTime
  • "2020-04-12 22:10:57+ 02: 00" => Дата + время + часовой пояс = DateTime

В ParseError(NotENOUGH) появляется, когда не хватает информации, чтобы заполнить весь объект. Например, отсутствует дата, время или часовой пояс.
Когда форматы не соответствуют строке, вы получаете ошибку ParseError(TooShort) или ParseError(Invalid).

Спецификация строкового формата, например "%Y-%m-%d %H:%M:%S": https://docs.rs/chrono/0.4.11/chrono/format/strftime/index.html

RFC2822 = Дата + Время + Часовой пояс

Чтобы преобразовать строку RFC2822, используйте функцию parse_from_rfc2822(..).

let date_str = "Tue, 1 Jul 2003 10:52:37 +0200";
let datetime = DateTime::parse_from_rfc2822(date_str).unwrap();

RFC3339 = Дата + Время + Часовой пояс

Чтобы преобразовать строку RFC3339 или ISO 8601, используйте функцию parse_from_rfc3339(..).

let date_str = "2020-04-12 22:10:57+02:00";
// convert the string into DateTime<FixedOffset>
let datetime = DateTime::parse_from_rfc3339(date_str).unwrap();
// convert the string into DateTime<Utc> or other timezone
let datetime_utc = datetime.with_timezone(&Utc);

Дата + время + часовой пояс (другой или нестандартный)

Для преобразования других строк DateTime используйте функцию parse_from_str(..).

let date_str = "2020-04-12 22:10:57 +02:00";
let datetime = DateTime::parse_from_str(date_str, "%Y-%m-%d %H:%M:%S %z").unwrap();

Дата + время

Если у вас нет часового пояса, вам нужно использовать NaiveDateTime. Этот объект не хранит часовой пояс:

let date_str = "2020-04-12 22:10:57";
let naive_datetime = NaiveDateTime::parse_from_str(date_str, "%Y-%m-%d %H:%M:%S").unwrap();

Дата

Если мы анализируем дату (без времени), мы можем сохранить ее в NaiveDate. Этот объект не хранит время или часовой пояс:

let date_str = "2020-04-12 22:10:57";
let naive_date = NaiveDate::parse_from_str(date_str, "%Y-%m-%d").unwrap();

Время

Если мы анализируем время (без даты), мы можем сохранить его в NaiveTime. Этот объект не хранит дату или часовой пояс:

let time_str = "22:10:57";
let naive_time = NaiveTime::parse_from_str(time_str, "%H:%M:%S").unwrap();

Добавить дату, время и / или часовой пояс

Если у нас есть строка, и мы хотим добавить больше информации, мы можем изменить тип. Но вы должны предоставить эту информацию самостоятельно.

let date_str = "2020-04-12";
// From string to a NaiveDate
let naive_date = NaiveDate::parse_from_str(date_str, "%Y-%m-%d").unwrap();
// Add some default time to convert it into a NaiveDateTime
let naive_datetime: NaiveDateTime = naive_date.and_hms(0,0,0);
// Add a timezone to the object to convert it into a DateTime<UTC>
let datetime_utc = DateTime::<Utc>::from_utc(naive_datetime, Utc);

Пример кода игровой площадки: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d2b83b3980a5f8fb2e798271766b4541

Другие вопросы по тегам