如何使用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
相关产品推荐
相关产品推荐

