Rust Chrono 如何解析日期字符串,ParseError(NotEnough) 和 ParseError(TooShort) 是什么?

30
1个回答

66

当将字符串转换为Chrono对象时,您必须知道字符串的输入格式具有哪些部分。
这些部分包括:日期、时间、时区
例如:

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 或 ISO 8601 字符串转换为日期时间,请使用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();

添加日期、时间和/或时区

如果我们有一些字符串并想要添加更多信息,我们可以改变类型。但是你必须自己提供这些信息。

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


1
如何通过仅提供格式将DateTime转换为字符串? - alexzander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接