Rust Chrono 解析日期字符串、ParseError(NotEnough) 和 ParseError(TooShort)
Rust Chrono parse date String, ParseError(NotEnough) and ParseError(TooShort)
如何将字符串转换为 chrono::DateTime or chrono::NaiveDateTime
ParseError(NotEnough) 或 ParseError(TooShort) 是什么意思?
将字符串转换为 Chrono 对象时,您必须知道字符串的输入格式包含哪些部分。
这些部分是:日期、时间、时区
示例:
- "2020-04-12" => 日期 = NaiveDate
- "22:10" => 时间 = NaiveTime
- "2020-04-12 22:10:57" => 日期 + 时间 = NaiveDateTime
- "2020-04-12 22:10:57+02:00" => 日期 + 时间 + 时区 = DateTime<Tz>
当没有足够的信息来填写整个对象时,ParseError(NotEnough) 会出现。例如缺少日期、时间或时区。
当格式与字符串不匹配时,您会收到 ParseError(TooShort) 或 ParseError(Invalid) 错误。
字符串格式规范,例如"%Y-%m-%d %H:%M:%S"
: https://docs.rs/chrono/latest/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 or ISO 8601 string use the parse_from_rfc3339(..) 函数。
let date_str = "2020-04-12T22: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";
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();
添加日期、时间and/or时区
如果我们有一些字符串并想添加更多信息,我们可以更改类型。但是你必须自己提供这些信息。
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);
如何将字符串转换为 chrono::DateTime or chrono::NaiveDateTime
ParseError(NotEnough) 或 ParseError(TooShort) 是什么意思?
将字符串转换为 Chrono 对象时,您必须知道字符串的输入格式包含哪些部分。
这些部分是:日期、时间、时区
示例:
- "2020-04-12" => 日期 = NaiveDate
- "22:10" => 时间 = NaiveTime
- "2020-04-12 22:10:57" => 日期 + 时间 = NaiveDateTime
- "2020-04-12 22:10:57+02:00" => 日期 + 时间 + 时区 = DateTime<Tz>
当没有足够的信息来填写整个对象时,ParseError(NotEnough) 会出现。例如缺少日期、时间或时区。
当格式与字符串不匹配时,您会收到 ParseError(TooShort) 或 ParseError(Invalid) 错误。
字符串格式规范,例如"%Y-%m-%d %H:%M:%S"
: https://docs.rs/chrono/latest/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 or ISO 8601 string use the parse_from_rfc3339(..) 函数。
let date_str = "2020-04-12T22: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";
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();
添加日期、时间and/or时区
如果我们有一些字符串并想添加更多信息,我们可以更改类型。但是你必须自己提供这些信息。
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);