Rust Chrono дата разбора String, ParseError (NotEnough) и ParseError (TooShort) - PullRequest
2 голосов
/ 13 апреля 2020

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

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

1 Ответ

3 голосов
/ 13 апреля 2020

При преобразовании строки в объект Chrono вы должны знать, какие части имеет формат ввода строки.
Части: Дата, время, часовой пояс
Примеры:

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

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

RFC2822 = Дата + Время + TimeZone

Для преобразования строки 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 = Дата + Время + TimeZone

Для преобразования 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 (..) function.

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();

Date + Time

Если у вас нет TimeZone, вам нужно использовать 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

...