簡體   English   中英

Rust Chrono 解析日期字符串,ParseError(NotEnough) 和 ParseError(TooShort)

[英]Rust Chrono parse date String, ParseError(NotEnough) and ParseError(TooShort)

如何將字符串轉換為 chrono ::DateTimechrono::NaiveDateTime

ParseError(NotEnough) 或 ParseError(TooShort) 是什么意思?

將字符串轉換為 Chrono object 時,您必須知道字符串的輸入格式包含哪些部分。
這些部分是:日期、時間、時區
例子:

  • "2020-04-12" => 日期 = NaiveDate
  • "22:10" => 時間 = NaiveTime
  • “2020-04-12 22:10:57” => 日期 + 時間 = NaiveDateTime
  • "2020-04-12 22:10:57+02:00" => 日期 + 時間 + 時區 = 日期時間<Tz>

當沒有足夠的信息來填寫整個 object 時,會出現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(..) function。

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(..) function。

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

日期+時間

當您沒有 TimeZone 時,您需要使用NaiveDateTime 此 object 不存儲時區:

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中。 此 object 不存儲時間或時區:

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

時間

如果我們在哪里解析時間(沒有日期),我們可以將它存儲在NaiveTime中。 此 object 不存儲日期或時區:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM