如何在Rust中获取一个月的天数?

7

有没有一种惯用的Rust方法来获取给定月份的天数?我查看了chrono,但在文档中没有找到相关内容。

我正在寻找类似于Python的calendar.monthrange或C#中的DateTime.DaysInMonth可以处理闰年的工具。


“最好的下一步是创建一个日历箱或类似的东西吗?”-- 如果这是您所需的唯一功能,那么这将是过度设计。编写这个函数相当简单,您尝试过了吗?甚至Wikipedia都有用于确定闰年的伪代码算法。 - Benjamin Lindley
我真正需要的是一个高级API,用于管理时间系列分析的日期时间。获取一个月的天数只是第一步。 - ludofet
2个回答

11
pub fn get_days_from_month(year: i32, month: u32) -> i64 {
    NaiveDate::from_ymd(
        match month {
            12 => year + 1,
            _ => year,
        },
        match month {
            12 => 1,
            _ => month + 1,
        },
        1,
    )
    .signed_duration_since(NaiveDate::from_ymd(year, month, 1))
    .num_days()
}

感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight
此外,最好解释一下与现有答案相比,答案带来了什么。它们似乎都使用相同的逻辑和函数。 - Shepmaster

7
你可以使用来自 chrono crateNaiveDate::signed_duration_since
use chrono::NaiveDate;

fn main() {
    let year = 2018;
    for (m, d) in (1..=12).map(|m| {
        (
            m,
            if m == 12 {
                NaiveDate::from_ymd(year + 1, 1, 1)
            } else {
                NaiveDate::from_ymd(year, m + 1, 1)
            }.signed_duration_since(NaiveDate::from_ymd(year, m, 1))
            .num_days(),
        )
    }) {
        println!("days {} in month {}", d, m);
    }
}

它起作用了,谢谢。 - ilham doang

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