将毫秒级Unix时间戳转换为PrimitiveDateTime遇类型不匹配问题求助
问题:毫秒级Unix时间戳转PrimitiveDateTime时类型不匹配
需要将HTTP请求传入的毫秒级Unix时间戳转换为PrimitiveDateTime类型(PostgreSQL数据库存储要求),但当前代码因跨库类型不兼容报错。
当前尝试代码
use ::time::{PrimitiveDateTime, OffsetDateTime}; use std::time::{UNIX_EPOCH, Duration}; use chrono::{DateTime, Utc, NaiveDateTime}; fn my_func() { let timestamp:u64 = 1696443084; // 来自HTTP请求的毫秒级时间戳(注:此处值少三位,应为1696443084000) let d:SystemTime = UNIX_EPOCH + Duration::from_secs(timestamp/1000); let datetime:DateTime<Utc> = DateTime::<Utc>::from(d); let created_at:PrimitiveDateTime = PrimitiveDateTime::new(datetime.date_naive(), datetime.time()); }
编译错误信息
106 | ... = PrimitiveDateTime::new(datetime.date_naive(), datetime.time(... | ^^^^^^^^^^^^^^^^^^^^^^ --------------------- --------------- expected `Time`, found `NaiveTime` | | | expected `Date`, found `NaiveDate` | note: associated function defined here --> /.../time-0.3.23/src/primitive_date_time.rs:92:18 | 92 | pub const fn new(date: ... | ^^^
解决方案
问题根源是混用了chrono和time两个库的日期时间类型,二者无法直接兼容。直接使用time库即可完成转换,无需依赖chrono:
use time::{PrimitiveDateTime, OffsetDateTime}; use std::time::{UNIX_EPOCH, Duration, SystemTime}; fn my_func() { // 来自HTTP请求的毫秒级Unix时间戳(补全三位毫秒) let timestamp: u64 = 1696443084000; // 从毫秒时间戳生成SystemTime let system_time = UNIX_EPOCH + Duration::from_millis(timestamp); // 转换为UTC时区的OffsetDateTime let offset_datetime = OffsetDateTime::from(system_time); // 提取PrimitiveDateTime(匹配PostgreSQL存储的无时区时间戳类型) let created_at: PrimitiveDateTime = offset_datetime.primitive_date_time(); }
说明
- 用
Duration::from_millis直接处理毫秒级时间戳,无需手动除以1000,避免精度丢失 - 全程使用
time库自身的类型转换链,彻底规避跨库类型不兼容问题 - Unix时间戳默认基于UTC时区,转换时使用UTC作为基准符合标准定义
内容的提问来源于stack exchange,提问作者Antonin GAVREL
相关产品推荐
相关产品推荐

