欢迎加入开源鸿蒙PC社区 https://harmonypc.csdn.net/欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloperAtomGit 仓库地址https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo本文讲解鸿蒙 PC 端 Rust 开发环境搭建鸿蒙基于 musl 库、强制二进制签名无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew提供两套编译方案方案一安装 llvm-gcc-compat零配置开箱即用方案二仅安装 ohos-sdk需手动配置 Cargo 链接器二者都依托 ohos-sdk 完成自动签名编译。可以来参考一下这个文章搭建环境OpenHarmony 鸿蒙 PC CodeArts IDE 实现 Rust开发完整开发环境搭建指南一、chrono 是什么chrono是 Rust 生态最主流、功能完整的日期时间处理库替代标准库单薄的std::time/SystemTime。标准库时间缺陷时区支持差、格式化繁琐、缺少日期加减、星期/月份便捷方法、无法简单解析日期字符串chrono 完整补齐所有时间业务需求是 Rust 后端、CLI、数据处理项目标配。核心作用支持本地时间、UTC时间、带时区时间时区计算完善日期快速加减年/月/日/时/分/秒自动处理月末、闰年边界强大格式化 字符串解析自定义格式模板获取星期、季度、月初月末、年份首尾、时间戳互转时间差值计算计算相隔几天、几小时支持序列化搭配 serde 存JSON/数据库兼容时间戳秒、毫秒、微秒、纳秒互相转换二、安装依赖1. 新建项目已有项目跳过cargonew chrono_democdchrono_demo2. 添加 chrono 依赖# 基础版本本地/UTC时间格式化cargoaddchrono# 如果需要时区支持拓展cargoaddchrono--featuresclock,timezone# 如果需要serde序列化接口/数据库必用cargoaddchrono--featuresserde打开Cargo.toml自动生成依赖[dependencies] chrono { version 0.4, features [clock, timezone, serde] }三、完整无报错 main.rs 示例覆盖绝大多数业务场景当前时间、格式化、解析字符串、日期偏移、时间戳、差值、月初月末、时区、serde序列化usechrono::{DateTime,Datelike,Local,Months,NaiveDate,NaiveDateTime,NaiveTime,TimeDelta,Utc,};fnmain(){// 1. 获取当前时间 println!( 1. 当前本地时间 / UTC 时间 );letnow_local:DateTimeLocalLocal::now();letnow_utc:DateTimeUtcUtc::now();println!(本地完整时间: {},now_local);println!(UTC 标准时间: {},now_utc);// 只获取日期/只获取时间无时区裸时间lettoday:NaiveDateLocal::now().date_naive();letnow_time:NaiveTimeLocal::now().time();println!(今日日期: {},today);println!(当前时刻: {},now_time);// 2. 时间格式化 println!(\n 2. 自定义格式化输出 );letfmt_str%Y-%m-%d %H:%M:%S;println!(标准格式: {},now_local.format(fmt_str));println!(仅年月日: {},now_local.format(%Y-%m-%d));println!(中文格式: {},now_local.format(%Y年%m月%d日 %H:%M:%S));println!(星期: {},now_local.format(%A));// 3. 字符串解析成时间 println!(\n 3. 字符串解析为日期时间 );letdate_text2026-08-15 14:30:00;matchNaiveDateTime::parse_from_str(date_text,fmt_str){Ok(dt)println!(解析成功: {},dt),Err(e)eprintln!(解析失败: {},e),}letday_text2026-10-01;letholidayNaiveDate::parse_from_str(day_text,%Y-%m-%d).unwrap();println!(解析纯日期: {},holiday);// 4. 日期加减 println!(\n 4. 日期偏移 加减年/月/日/时/分 );lettomorrowtodayTimeDelta::days(1);letlast_monthtoday-TimeDelta::days(30);letafter_2_hourLocal::now()TimeDelta::hours(2);println!(明天: {},tomorrow);println!(30天前: {},last_month);println!(2小时后: {},after_2_hour.format(fmt_str));// 按月偏移letnext_monthtoday.checked_add_months(Months::new(1)).unwrap();println!(下个月今日: {},next_month);// 5. 时间戳互转 println!(\n 5. 时间戳转换 );letnowUtc::now();letts_secnow.timestamp();letts_msnow.timestamp_millis();println!(UTC 秒级时间戳: {},ts_sec);println!(UTC 毫秒时间戳: {},ts_ms);letfrom_secDateTime::from_timestamp(ts_sec,0).unwrap();println!(时间戳还原UTC时间: {},from_sec);// 6. 计算两个时间差值 println!(\n 6. 计算时间间隔 );letstartNaiveDate::from_ymd_opt(2026,1,1).unwrap();letendNaiveDate::from_ymd_opt(2026,12,31).unwrap();letdiffend-start;println!(2026全年相差天数: {} 天,diff.num_days());println!(相差小时数: {} h,diff.num_hours());// 7. 获取月初、月末 println!(\n 7. 当月第一天 / 当月最后一天 );letcurrent_month_firsttoday.with_day(1).unwrap();letnext_month_firstcurrent_month_first.checked_add_months(Months::new(1)).unwrap();letcurrent_month_lastnext_month_first-TimeDelta::days(1);println!(本月一号: {},current_month_first);println!(本月最后一天: {},current_month_last);}四、运行cargorunchrono是 Rust 生态最主流、功能最全的日期时间处理库替代标准库简陋的时间工具支持时区、格式化、解析、时间偏移、时间戳、日期差值、月初月末等业务常用能力。前置配置先在Cargo.toml引入依赖推荐开启本地时区、月份运算功能[dependencies] chrono { version 0.4, features [local, months] }导入包中核心类型usechrono::{DateTime,Datelike,Local,Months,NaiveDate,NaiveDateTime,NaiveTime,TimeDelta,Utc,};先区分核心概念看懂下面代码的关键带时区时间DateTimeLocal本地时区、DateTimeUtcUTC零时区包含时区信息可直接格式化、转时间戳裸时间无时区NaiveDate只有年月日无时分秒、无时区NaiveTime只有时分秒无年月日、无时区NaiveDateTime年月日时分秒没有时区仅存储纯时间数字TimeDelta时间间隔用来做时间加减天/时/分/秒/毫秒Months专门按月偏移解决2月、大小月天数不一致问题TimeDelta只能按固定天数偏移Dateliketrait提供年月日、星期、当月第几天等日期取值方法1. 获取当前时间letnow_local:DateTimeLocalLocal::now();letnow_utc:DateTimeUtcUtc::now();println!(本地完整时间: {},now_local);println!(UTC 标准时间: {},now_utc);// 只提取裸日期 / 裸时刻lettoday:NaiveDateLocal::now().date_naive();letnow_time:NaiveTimeLocal::now().time();println!(今日日期: {},today);println!(当前时刻: {},now_time);详解Local::now()获取操作系统本地时区当前完整时间东八区北京时间Utc::now()获取零时区标准时间服务器存储时间戳优先用UTC避免时区混乱.date_naive()从带时区时间中剥离时区只保留年月日NaiveDate.time()剥离日期只保留时分秒NaiveTime输出示例本地完整时间: 2026-06-18 15:20:30.123456 08:00 UTC 标准时间: 2026-06-18 07:20:30.123456 UTC 今日日期: 2026-06-18 当前时刻: 15:20:30.1234562. 时间格式化输出letfmt_str%Y-%m-%d %H:%M:%S;println!(标准格式: {},now_local.format(fmt_str));println!(仅年月日: {},now_local.format(%Y-%m-%d));println!(中文格式: {},now_local.format(%Y年%m月%d日 %H:%M:%S));println!(星期: {},now_local.format(%A));格式化占位符常用对照表占位符含义示例%Y4位年份2026%m两位月份06%d两位日期18%H24小时制小时15%M分钟20%S秒30%A完整英文星期Thursday%w数字星期(0周日)4说明.format(模板字符串)支持带时区DateTime和裸时间NaiveDateTime可以自由拼接中文非常适合前端展示、日志打印。3. 字符串解析成时间letdate_text2026-08-15 14:30:00;matchNaiveDateTime::parse_from_str(date_text,fmt_str){Ok(dt)println!(解析成功: {},dt),Err(e)eprintln!(解析失败: {},e),}letday_text2026-10-01;letholidayNaiveDate::parse_from_str(day_text,%Y-%m-%d).unwrap();println!(解析纯日期: {},holiday);核心逻辑parse_from_str(待解析字符串, 格式化模板)模板必须和字符串格式完全匹配否则返回解析错误。NaiveDateTime::parse_from_str解析「年月日 时分秒」完整字符串NaiveDate::parse_from_str只解析纯日期不带时分秒错误处理返回ResultT, ParseErrormatch分支生产环境推荐优雅处理格式错误.unwrap()测试、确定字符串格式合法时快速取值格式不对程序直接panic4. 日期时间加减偏移4.1 TimeDelta 固定时长偏移天/时/分/秒lettomorrowtodayTimeDelta::days(1);letlast_monthtoday-TimeDelta::days(30);letafter_2_hourLocal::now()TimeDelta::hours(2);println!(明天: {},tomorrow);println!(30天前: {},last_month);println!(2小时后: {},after_2_hour.format(fmt_str));TimeDelta代表固定时长支持TimeDelta::days(n)天TimeDelta::hours(n)小时TimeDelta::minutes(n)分钟TimeDelta::seconds(n)秒4.2 Months 按月自然偏移推荐处理月份letnext_monthtoday.checked_add_months(Months::new(1)).unwrap();println!(下个月今日: {},next_month);关键区别重点TimeDelta::days(30)强制固定30天遇到大小月、2月会出错例1月31日 30天 3月2日不符合“下个月同一天”业务需求checked_add_months(Months::new(1))自然按月跳转1月31日 → 2月28/29日3月31日→4月30日完美适配日历逻辑checked_add_months返回Option月末跨月无对应日期返回None.unwrap()适合确定合法场景5. 时间戳互转前后端交互核心letnowUtc::now();letts_secnow.timestamp();letts_msnow.timestamp_millis();println!(UTC 秒级时间戳: {},ts_sec);println!(UTC 毫秒时间戳: {},ts_ms);letfrom_secDateTime::from_timestamp(ts_sec,0).unwrap();println!(时间戳还原UTC时间: {},from_sec);方法说明.timestamp()输出秒级时间戳i64后端接口通用.timestamp_millis()输出毫秒时间戳前端JS常用DateTime::from_timestamp(秒, 纳秒)秒级时间戳转回带时区UTC时间第二个参数是纳秒补充不需要填0即可最佳实践数据库存储、接口传输一律使用UTC时间戳避免本地时区导致的时差bug。6. 计算两个时间差值letstartNaiveDate::from_ymd_opt(2026,1,1).unwrap();letendNaiveDate::from_ymd_opt(2026,12,31).unwrap();letdiffend-start;println!(2026全年相差天数: {} 天,diff.num_days());println!(相差小时数: {} h,diff.num_hours());流程拆解NaiveDate::from_ymd_opt(年,月,日)安全构造日期返回OptionNaiveDate非法日期2月30日返回None两个同类型时间相减得到TimeDelta差值对象差值取值方法.num_days()总相差天数.num_hours()总相差小时.num_minutes()/.num_seconds()总分钟、总秒数适用场景倒计时、活动剩余时长、计算年龄、统计间隔天数。7. 获取当月第一天、当月最后一天letcurrent_month_firsttoday.with_day(1).unwrap();letnext_month_firstcurrent_month_first.checked_add_months(Months::new(1)).unwrap();letcurrent_month_lastnext_month_first-TimeDelta::days(1);println!(本月一号: {},current_month_first);println!(本月最后一天: {},current_month_last);逻辑分步拆解.with_day(1)把当前日期强制改为当月1号得到本月首日本月1号 1个月 → 下个月1号下个月1号 减1天 → 本月最后一天优势自动兼容28/29天2月、31天大月、30天小月不用手动判断月份天数报表统计、月度筛选高频使用。关键类型总结 使用建议什么时候用 Naive裸时间只做本地日期计算、报表统计、不需要跨时区传输本地文件存储、仅程序内部计算什么时候用 DateTime/DateTime和前端、数据库交互、生成时间戳需要格式化展示本地时间、处理时区转换加减选择固定时长往后推2小时、7天→TimeDelta自然月/年下个月、去年今日→Months安全编码小提示构造日期、月份偏移优先用xxx_opt match 处理None少用unwrap上线对外接口时间统一用UTC时间戳避免时区混乱解析用户输入日期必须捕获解析错误防止非法格式panic五、核心模块与类型说明1. 基础时间类型类型含义使用场景NaiveDate纯日期无时间、无时区生日、订单创建日NaiveTime纯时刻无日期、无时区固定每日执行时刻NaiveDateTime日期时刻无时区数据库不带时区存储DateTimeLocal带本地时区完整时间展示给前端本地时间DateTimeUtcUTC零时区时间服务统一存储、时间戳2. 关键结构体TimeDelta时间差值days/hours/minutes/secondsMonths按月偏移自动适配大小月、闰年3. 格式化模板常用占位符%Y4位年份2026%m两位月份01~12%d两位日期01~31%H24小时制00~23%M分钟00~59%S秒%A完整星期名称 Monday%w数字星期 0周日六、常用Feature功能说明clock默认开启Local::now()/Utc::now()获取系统当前时间关闭则无法获取实时时间。timezone拓展时区库支持Asia/Shanghai等完整IANA时区用于跨国系统。serde实现Serialize/Deserialize时间结构体直接转JSONWeb后端必备。rkyv / sqlx额外feature适配数据库ORMsqlx、diesel直接存取时间字段。七、典型业务开发场景Web后端接口UTC时间存库本地时区格式化返回前端JSON序列化时间定时任务计算计算下月执行日、每月1号、距离过期剩余天数日志系统日志打印格式化时间、计算请求耗时两个时间差值数据库业务生日、订单创建时间、活动起止时间校验爬虫/数据同步时间戳转换、按日期分段拉取历史数据八、优势对比标准库std::time标准库SystemTime只支持时间戳无日期、月份、星期操作chrono自动处理闰年、2月、月末边界不用手动判断统一格式化/解析模板不用手写复杂转换原生支持时区解决前后端时区错乱问题生态兼容serde、sqlx、axum、rocket等主流框架。
鸿蒙PC适配llvm-gcc-compat编译安装第三方库chrono,打造Rust 第三方日期时间处理库
欢迎加入开源鸿蒙PC社区 https://harmonypc.csdn.net/欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloperAtomGit 仓库地址https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo本文讲解鸿蒙 PC 端 Rust 开发环境搭建鸿蒙基于 musl 库、强制二进制签名无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew提供两套编译方案方案一安装 llvm-gcc-compat零配置开箱即用方案二仅安装 ohos-sdk需手动配置 Cargo 链接器二者都依托 ohos-sdk 完成自动签名编译。可以来参考一下这个文章搭建环境OpenHarmony 鸿蒙 PC CodeArts IDE 实现 Rust开发完整开发环境搭建指南一、chrono 是什么chrono是 Rust 生态最主流、功能完整的日期时间处理库替代标准库单薄的std::time/SystemTime。标准库时间缺陷时区支持差、格式化繁琐、缺少日期加减、星期/月份便捷方法、无法简单解析日期字符串chrono 完整补齐所有时间业务需求是 Rust 后端、CLI、数据处理项目标配。核心作用支持本地时间、UTC时间、带时区时间时区计算完善日期快速加减年/月/日/时/分/秒自动处理月末、闰年边界强大格式化 字符串解析自定义格式模板获取星期、季度、月初月末、年份首尾、时间戳互转时间差值计算计算相隔几天、几小时支持序列化搭配 serde 存JSON/数据库兼容时间戳秒、毫秒、微秒、纳秒互相转换二、安装依赖1. 新建项目已有项目跳过cargonew chrono_democdchrono_demo2. 添加 chrono 依赖# 基础版本本地/UTC时间格式化cargoaddchrono# 如果需要时区支持拓展cargoaddchrono--featuresclock,timezone# 如果需要serde序列化接口/数据库必用cargoaddchrono--featuresserde打开Cargo.toml自动生成依赖[dependencies] chrono { version 0.4, features [clock, timezone, serde] }三、完整无报错 main.rs 示例覆盖绝大多数业务场景当前时间、格式化、解析字符串、日期偏移、时间戳、差值、月初月末、时区、serde序列化usechrono::{DateTime,Datelike,Local,Months,NaiveDate,NaiveDateTime,NaiveTime,TimeDelta,Utc,};fnmain(){// 1. 获取当前时间 println!( 1. 当前本地时间 / UTC 时间 );letnow_local:DateTimeLocalLocal::now();letnow_utc:DateTimeUtcUtc::now();println!(本地完整时间: {},now_local);println!(UTC 标准时间: {},now_utc);// 只获取日期/只获取时间无时区裸时间lettoday:NaiveDateLocal::now().date_naive();letnow_time:NaiveTimeLocal::now().time();println!(今日日期: {},today);println!(当前时刻: {},now_time);// 2. 时间格式化 println!(\n 2. 自定义格式化输出 );letfmt_str%Y-%m-%d %H:%M:%S;println!(标准格式: {},now_local.format(fmt_str));println!(仅年月日: {},now_local.format(%Y-%m-%d));println!(中文格式: {},now_local.format(%Y年%m月%d日 %H:%M:%S));println!(星期: {},now_local.format(%A));// 3. 字符串解析成时间 println!(\n 3. 字符串解析为日期时间 );letdate_text2026-08-15 14:30:00;matchNaiveDateTime::parse_from_str(date_text,fmt_str){Ok(dt)println!(解析成功: {},dt),Err(e)eprintln!(解析失败: {},e),}letday_text2026-10-01;letholidayNaiveDate::parse_from_str(day_text,%Y-%m-%d).unwrap();println!(解析纯日期: {},holiday);// 4. 日期加减 println!(\n 4. 日期偏移 加减年/月/日/时/分 );lettomorrowtodayTimeDelta::days(1);letlast_monthtoday-TimeDelta::days(30);letafter_2_hourLocal::now()TimeDelta::hours(2);println!(明天: {},tomorrow);println!(30天前: {},last_month);println!(2小时后: {},after_2_hour.format(fmt_str));// 按月偏移letnext_monthtoday.checked_add_months(Months::new(1)).unwrap();println!(下个月今日: {},next_month);// 5. 时间戳互转 println!(\n 5. 时间戳转换 );letnowUtc::now();letts_secnow.timestamp();letts_msnow.timestamp_millis();println!(UTC 秒级时间戳: {},ts_sec);println!(UTC 毫秒时间戳: {},ts_ms);letfrom_secDateTime::from_timestamp(ts_sec,0).unwrap();println!(时间戳还原UTC时间: {},from_sec);// 6. 计算两个时间差值 println!(\n 6. 计算时间间隔 );letstartNaiveDate::from_ymd_opt(2026,1,1).unwrap();letendNaiveDate::from_ymd_opt(2026,12,31).unwrap();letdiffend-start;println!(2026全年相差天数: {} 天,diff.num_days());println!(相差小时数: {} h,diff.num_hours());// 7. 获取月初、月末 println!(\n 7. 当月第一天 / 当月最后一天 );letcurrent_month_firsttoday.with_day(1).unwrap();letnext_month_firstcurrent_month_first.checked_add_months(Months::new(1)).unwrap();letcurrent_month_lastnext_month_first-TimeDelta::days(1);println!(本月一号: {},current_month_first);println!(本月最后一天: {},current_month_last);}四、运行cargorunchrono是 Rust 生态最主流、功能最全的日期时间处理库替代标准库简陋的时间工具支持时区、格式化、解析、时间偏移、时间戳、日期差值、月初月末等业务常用能力。前置配置先在Cargo.toml引入依赖推荐开启本地时区、月份运算功能[dependencies] chrono { version 0.4, features [local, months] }导入包中核心类型usechrono::{DateTime,Datelike,Local,Months,NaiveDate,NaiveDateTime,NaiveTime,TimeDelta,Utc,};先区分核心概念看懂下面代码的关键带时区时间DateTimeLocal本地时区、DateTimeUtcUTC零时区包含时区信息可直接格式化、转时间戳裸时间无时区NaiveDate只有年月日无时分秒、无时区NaiveTime只有时分秒无年月日、无时区NaiveDateTime年月日时分秒没有时区仅存储纯时间数字TimeDelta时间间隔用来做时间加减天/时/分/秒/毫秒Months专门按月偏移解决2月、大小月天数不一致问题TimeDelta只能按固定天数偏移Dateliketrait提供年月日、星期、当月第几天等日期取值方法1. 获取当前时间letnow_local:DateTimeLocalLocal::now();letnow_utc:DateTimeUtcUtc::now();println!(本地完整时间: {},now_local);println!(UTC 标准时间: {},now_utc);// 只提取裸日期 / 裸时刻lettoday:NaiveDateLocal::now().date_naive();letnow_time:NaiveTimeLocal::now().time();println!(今日日期: {},today);println!(当前时刻: {},now_time);详解Local::now()获取操作系统本地时区当前完整时间东八区北京时间Utc::now()获取零时区标准时间服务器存储时间戳优先用UTC避免时区混乱.date_naive()从带时区时间中剥离时区只保留年月日NaiveDate.time()剥离日期只保留时分秒NaiveTime输出示例本地完整时间: 2026-06-18 15:20:30.123456 08:00 UTC 标准时间: 2026-06-18 07:20:30.123456 UTC 今日日期: 2026-06-18 当前时刻: 15:20:30.1234562. 时间格式化输出letfmt_str%Y-%m-%d %H:%M:%S;println!(标准格式: {},now_local.format(fmt_str));println!(仅年月日: {},now_local.format(%Y-%m-%d));println!(中文格式: {},now_local.format(%Y年%m月%d日 %H:%M:%S));println!(星期: {},now_local.format(%A));格式化占位符常用对照表占位符含义示例%Y4位年份2026%m两位月份06%d两位日期18%H24小时制小时15%M分钟20%S秒30%A完整英文星期Thursday%w数字星期(0周日)4说明.format(模板字符串)支持带时区DateTime和裸时间NaiveDateTime可以自由拼接中文非常适合前端展示、日志打印。3. 字符串解析成时间letdate_text2026-08-15 14:30:00;matchNaiveDateTime::parse_from_str(date_text,fmt_str){Ok(dt)println!(解析成功: {},dt),Err(e)eprintln!(解析失败: {},e),}letday_text2026-10-01;letholidayNaiveDate::parse_from_str(day_text,%Y-%m-%d).unwrap();println!(解析纯日期: {},holiday);核心逻辑parse_from_str(待解析字符串, 格式化模板)模板必须和字符串格式完全匹配否则返回解析错误。NaiveDateTime::parse_from_str解析「年月日 时分秒」完整字符串NaiveDate::parse_from_str只解析纯日期不带时分秒错误处理返回ResultT, ParseErrormatch分支生产环境推荐优雅处理格式错误.unwrap()测试、确定字符串格式合法时快速取值格式不对程序直接panic4. 日期时间加减偏移4.1 TimeDelta 固定时长偏移天/时/分/秒lettomorrowtodayTimeDelta::days(1);letlast_monthtoday-TimeDelta::days(30);letafter_2_hourLocal::now()TimeDelta::hours(2);println!(明天: {},tomorrow);println!(30天前: {},last_month);println!(2小时后: {},after_2_hour.format(fmt_str));TimeDelta代表固定时长支持TimeDelta::days(n)天TimeDelta::hours(n)小时TimeDelta::minutes(n)分钟TimeDelta::seconds(n)秒4.2 Months 按月自然偏移推荐处理月份letnext_monthtoday.checked_add_months(Months::new(1)).unwrap();println!(下个月今日: {},next_month);关键区别重点TimeDelta::days(30)强制固定30天遇到大小月、2月会出错例1月31日 30天 3月2日不符合“下个月同一天”业务需求checked_add_months(Months::new(1))自然按月跳转1月31日 → 2月28/29日3月31日→4月30日完美适配日历逻辑checked_add_months返回Option月末跨月无对应日期返回None.unwrap()适合确定合法场景5. 时间戳互转前后端交互核心letnowUtc::now();letts_secnow.timestamp();letts_msnow.timestamp_millis();println!(UTC 秒级时间戳: {},ts_sec);println!(UTC 毫秒时间戳: {},ts_ms);letfrom_secDateTime::from_timestamp(ts_sec,0).unwrap();println!(时间戳还原UTC时间: {},from_sec);方法说明.timestamp()输出秒级时间戳i64后端接口通用.timestamp_millis()输出毫秒时间戳前端JS常用DateTime::from_timestamp(秒, 纳秒)秒级时间戳转回带时区UTC时间第二个参数是纳秒补充不需要填0即可最佳实践数据库存储、接口传输一律使用UTC时间戳避免本地时区导致的时差bug。6. 计算两个时间差值letstartNaiveDate::from_ymd_opt(2026,1,1).unwrap();letendNaiveDate::from_ymd_opt(2026,12,31).unwrap();letdiffend-start;println!(2026全年相差天数: {} 天,diff.num_days());println!(相差小时数: {} h,diff.num_hours());流程拆解NaiveDate::from_ymd_opt(年,月,日)安全构造日期返回OptionNaiveDate非法日期2月30日返回None两个同类型时间相减得到TimeDelta差值对象差值取值方法.num_days()总相差天数.num_hours()总相差小时.num_minutes()/.num_seconds()总分钟、总秒数适用场景倒计时、活动剩余时长、计算年龄、统计间隔天数。7. 获取当月第一天、当月最后一天letcurrent_month_firsttoday.with_day(1).unwrap();letnext_month_firstcurrent_month_first.checked_add_months(Months::new(1)).unwrap();letcurrent_month_lastnext_month_first-TimeDelta::days(1);println!(本月一号: {},current_month_first);println!(本月最后一天: {},current_month_last);逻辑分步拆解.with_day(1)把当前日期强制改为当月1号得到本月首日本月1号 1个月 → 下个月1号下个月1号 减1天 → 本月最后一天优势自动兼容28/29天2月、31天大月、30天小月不用手动判断月份天数报表统计、月度筛选高频使用。关键类型总结 使用建议什么时候用 Naive裸时间只做本地日期计算、报表统计、不需要跨时区传输本地文件存储、仅程序内部计算什么时候用 DateTime/DateTime和前端、数据库交互、生成时间戳需要格式化展示本地时间、处理时区转换加减选择固定时长往后推2小时、7天→TimeDelta自然月/年下个月、去年今日→Months安全编码小提示构造日期、月份偏移优先用xxx_opt match 处理None少用unwrap上线对外接口时间统一用UTC时间戳避免时区混乱解析用户输入日期必须捕获解析错误防止非法格式panic五、核心模块与类型说明1. 基础时间类型类型含义使用场景NaiveDate纯日期无时间、无时区生日、订单创建日NaiveTime纯时刻无日期、无时区固定每日执行时刻NaiveDateTime日期时刻无时区数据库不带时区存储DateTimeLocal带本地时区完整时间展示给前端本地时间DateTimeUtcUTC零时区时间服务统一存储、时间戳2. 关键结构体TimeDelta时间差值days/hours/minutes/secondsMonths按月偏移自动适配大小月、闰年3. 格式化模板常用占位符%Y4位年份2026%m两位月份01~12%d两位日期01~31%H24小时制00~23%M分钟00~59%S秒%A完整星期名称 Monday%w数字星期 0周日六、常用Feature功能说明clock默认开启Local::now()/Utc::now()获取系统当前时间关闭则无法获取实时时间。timezone拓展时区库支持Asia/Shanghai等完整IANA时区用于跨国系统。serde实现Serialize/Deserialize时间结构体直接转JSONWeb后端必备。rkyv / sqlx额外feature适配数据库ORMsqlx、diesel直接存取时间字段。七、典型业务开发场景Web后端接口UTC时间存库本地时区格式化返回前端JSON序列化时间定时任务计算计算下月执行日、每月1号、距离过期剩余天数日志系统日志打印格式化时间、计算请求耗时两个时间差值数据库业务生日、订单创建时间、活动起止时间校验爬虫/数据同步时间戳转换、按日期分段拉取历史数据八、优势对比标准库std::time标准库SystemTime只支持时间戳无日期、月份、星期操作chrono自动处理闰年、2月、月末边界不用手动判断统一格式化/解析模板不用手写复杂转换原生支持时区解决前后端时区错乱问题生态兼容serde、sqlx、axum、rocket等主流框架。