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

如何在TypeScript中创建匹配PostgreSQL 6位精度时间戳的Date对象

在TypeScript中创建匹配6位精度无时区Timestamp的Date对象

首先明确核心点:JavaScript/TypeScript的Date对象本身支持微秒级精度(6位小数),只是部分显示方法会截断为毫秒,但内部精度是保留的。下面分两种常用方法实现:

方法1:直接用字符串构造Date

Date构造函数可以直接解析带6位小数的时间字符串,注意无时区字符串默认会被当作本地时区处理;如果你的数据库时间是UTC,记得给字符串加Z后缀。

示例代码:

const sqlTimestamp = '2022-08-04 08:16:32.716904';
// 转换为ISO格式,本地时区版本
const localIsoString = sqlTimestamp.replace(' ', 'T');
// UTC时区版本(如果数据库时间是UTC就用这个)
// const utcIsoString = sqlTimestamp.replace(' ', 'T') + 'Z';

const preciseDate = new Date(localIsoString);

// 验证精度:获取完整微秒数值
const ms = preciseDate.getTime();
const [_, microPart] = sqlTimestamp.split('.');
const fullMicro = ms * 1000 + parseInt(microPart);
console.log(fullMicro); // 输出包含6位精度的时间值

方法2:手动拆分时间分量构造

如果担心字符串解析的兼容性,可以拆分时间的各个部分,手动构造Date:

const sqlTimestamp = '2022-08-04 08:16:32.716904';
const [dateStr, timeStr] = sqlTimestamp.split(' ');
const [year, month, day] = dateStr.split('-').map(Number);
const [hours, minutes, secMicroStr] = timeStr.split(':');
const [seconds, microseconds] = secMicroStr.split('.').map(Number);

// 注意:Date的月份参数是从0开始的,要减1
const preciseDate = new Date(year, month - 1, day, hours, minutes, seconds, Math.floor(microseconds / 1000));
// 剩下的3位微秒可以单独存储,因为Date的getMilliseconds只能返回前3位
const extraMicro = microseconds % 1000;

关键注意事项

  • Date的toString()这类方法只会显示到毫秒,但内部的时间戳是完整的,微秒部分可以通过原始字符串或额外变量保留。
  • 如果数据库时间是UTC,一定要加Z后缀,否则会被当作本地时区解析,导致时间偏差。
  • Prisma处理DateTime @db.Timestamp(6)时,返回的Date对象已经包含完整微秒精度,调用toISOString()就能看到完整的6位小数格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:15:36