rust 我能知道Chrono是否消耗了完整的格式字符串吗?

polhcujo  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(130)

请考虑以下情况

use chrono;

fn main() {
    println!("{:?}", chrono::NaiveDate::parse_from_str("1978-01-12 01:00:23", "%Y-%m-%d %H:%M:%S"))
}

字符串包含year-month-day-hour-minute-second,但chrono只解析year-month-day。正如预期的那样,因为我使用了NaiveDate,而不是NaiveDateTime
但是,有没有一种方法可以告诉(编程)chrono“消耗”了整个格式字符串?

csbfibhn

csbfibhn1#

使用parse

use chrono;

fn main() {
    let d: chrono::NaiveDate = "1978-01-12 01:00:23".parse().unwrap();
    println!("{:?}", d)
}

结果:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseError(TooLong)', src/main.rs:5:62

如果您想使用格式解析,那么什么会阻止您检查格式是否不包含%H%M%S

q3qa4bjr

q3qa4bjr2#

让我们看看parse_from_str()的实现:
NaiveDateTime:

pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDateTime> {
    let mut parsed = Parsed::new();
    parse(&mut parsed, s, StrftimeItems::new(fmt))?;
    parsed.to_naive_datetime_with_offset(0) // no offset adjustment
}

初始日期:

pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult<NaiveDate> {
    let mut parsed = Parsed::new();
    parse(&mut parsed, s, StrftimeItems::new(fmt))?;
    parsed.to_naive_date()
}

除了最后一行之外,这两个实现看起来是相同的。因此,用于NaiveDate示例的Parsed示例本质上与用于NaiveDateTime变体的Parsed示例相同。换句话说,整个格式都以相同的方式“使用”,但在NaiveDate的情况下,您基本上只是使用了解析的日期-时间值的日期部分。
不知道你到底在找什么,但我希望这些信息能有所帮助。
如果你只想通过使用NaiveDate来检查你是否“丢失”了一个“非零”时间分量(00:00:00),那么我猜你可能只需要解析一个NaiveDateTime并检查它的NaiveTime值是否为“零”。

euoag5mw

euoag5mw3#

您可以创建一个原始StrftimeItems并检查是否有任何项是时间组件。在NumericFixed中有很多变体,但所有这些变体似乎都是明确的时间或非时间。
您可以检查该字符串是否具有列出的任何时间说明符here。所以%H%k%I%l等。您需要重新创建chrono的解析,但这并不太复杂,因为只有一个特殊字符%
您可以解析NaiveDateTime并检查结果是否具有非零时间分量。这实际上并不起作用,因为解析的时间可能有00:00:00,但这对您来说可能没问题。
您可以重新格式化结果NaiveDate,看看它是否与解析的时间匹配。还有其他需要忽略的差异,主要是在 shell 和填充方面。

相关问题