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

如何将DateTime::now()/Utc::now()转换为NaiveDateTime?(Diesel+chrono场景)

解决Diesel+Chrono中NaiveDateTime的当前时间获取与转换问题

嘿,这个问题我之前在项目里也碰到过,给你一步步讲清楚:

为什么NaiveDateTime没有now()方法?

首先得明白,NaiveDateTime是无时区的时间类型——它只记录年、月、日、时、分、秒这些数值,不关联任何时区信息。而系统的“当前时间”必然是和某个时区绑定的(比如UTC或本地时区),所以chrono没有给NaiveDateTime直接提供now()方法,这是设计上的合理选择。

两种获取当前时间并转为NaiveDateTime的方法

你提到DateTime有Utc::now(),其实只要调用它的转换方法就能得到NaiveDateTime,分两种场景:

1. 获取UTC时区的NaiveDateTime(推荐用于数据库存储)

如果你的数据库是用UTC时间统一存储(这是最佳实践,避免时区混乱),直接用Utc::now()的naive_utc()方法:

use chrono::{Utc, NaiveDateTime};

// 得到UTC时间对应的无时区NaiveDateTime
let current_utc_naive: NaiveDateTime = Utc::now().naive_utc();

2. 获取本地时区的NaiveDateTime

如果业务需要用本地时间(不推荐存数据库,适合展示层),可以用Local::now()的naive_local()方法:

use chrono::{Local, NaiveDateTime};

// 得到本地时间对应的无时区NaiveDateTime
let current_local_naive: NaiveDateTime = Local::now().naive_local();

额外提示:Diesel中的时区适配

如果你的数据库字段是带时区的类型(比如PostgreSQL的TIMESTAMPTZ),其实可以直接在Diesel模型中使用DateTime<Utc>类型,Diesel会自动处理时区转换,不需要转成NaiveDateTime。只有当字段是无时区的TIMESTAMP时,才需要用NaiveDateTime。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:22