You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rust的NaiveDate获取每月的起止日期?

获取chrono::NaiveDate的每月最后日期

有几种简单可行的方案解决这个问题,下面逐一说明:

方案1:直接使用Datelike::days_in_month方法

Datelike trait提供了days_in_month()方法,能直接返回当前日期所在月份的总天数,是最直接高效的方式:

use chrono::{NaiveDate, Datelike};

// 假设year已提前定义
let mut container = Vec::new();
for m in 1..=12 {
    let start_date = NaiveDate::from_ymd(year, m, 1);
    // 直接获取当月总天数
    let end_day = start_date.days_in_month();
    let end_date = NaiveDate::from_ymd(year, m, end_day);
    container.push((start_date, end_date));
}

方案2:通过下个月第一天减一天实现

如果不想依赖days_in_month,可以先获取下个月的第一天,再减去一天得到当月最后一天,这种方法能自动处理闰年、大小月的差异:

use chrono::{NaiveDate, Datelike};

// 假设year已提前定义
let mut container = Vec::new();
for m in 1..=12 {
    let start_date = NaiveDate::from_ymd(year, m, 1);
    // 计算下个月的第一天:如果是12月,年份加1,月份设为1;否则月份加1
    let next_month_start = if m == 12 {
        NaiveDate::from_ymd(year + 1, 1, 1)
    } else {
        NaiveDate::from_ymd(year, m + 1, 1)
    };
    // 减去一天得到当月最后一天
    let end_date = next_month_start - chrono::Duration::days(1);
    container.push((start_date, end_date));
}

关于day0方法的补充思路

day0返回的是当月的第0天(即上个月的最后一天),其实不太适合直接获取当月最后一天,但可以换个思路:获取下个月的第0天,也就是当前月的最后一天——因为from_ymd支持容错,日期设为0时会自动回退到上个月的最后一天:

use chrono::{NaiveDate, Datelike};

// 假设year已提前定义
let mut container = Vec::new();
for m in 1..=12 {
    let start_date = NaiveDate::from_ymd(year, m, 1);
    let end_date = if m == 12 {
        NaiveDate::from_ymd(year + 1, 1, 0)
    } else {
        NaiveDate::from_ymd(year, m + 1, 0)
    };
    container.push((start_date, end_date));
}

内容的提问来源于stack exchange,提问作者DennyHiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:31:34