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

如何使用Supabase-JS客户端插入无时区时间戳?

解决Supabase插入客户端精准无时区时间戳的问题

问题原因

Date.now()返回的是毫秒级时间戳数字(比如1716210600000),而PostgreSQL的timestamp without time zone类型只接受合法的时间字符串(如YYYY-MM-DD HH:MM:SS),直接传数字会被数据库误判为年份,自然超出时间范围报错。

而NOW()是数据库端生成的时间,确实会因为网络请求的往返延迟,和客户端当前时间有偏差,所以需要用客户端时间直接生成符合要求的格式插入。


两种可行方案

1. 客户端直接生成符合格式的时间字符串

把客户端时间转换成PostgreSQL能识别的无时区时间戳格式,比如YYYY-MM-DD HH:MM:SS:

// 生成无时区时间字符串(本地时间)
const clientTime = new Date().toISOString().slice(0, 19).replace('T', ' ');

// 插入Supabase
const { data, error } = await supabase
  .from('your_table_name')
  .insert([{ your_timestamp_column: clientTime }]);
  • toISOString()会生成类似2024-05-20T14:30:00.000Z的字符串,截取前19位再替换T为空格,就得到2024-05-20 14:30:00,完全符合无时区timestamp的要求。
  • 如果需要用UTC时间而非本地时间,直接截取toISOString()的前19位即可,无需额外调整。

2. 用PostgreSQL函数转换毫秒时间戳

如果想直接传Date.now()的毫秒数,可以用PostgreSQL的to_timestamp()函数把秒级时间戳转成timestamp(注意要把毫秒除以1000转成秒):

const timestampMs = Date.now();

// 用supabase.raw传入转换逻辑
const { data, error } = await supabase
  .from('your_table_name')
  .insert([{ your_timestamp_column: supabase.raw(`to_timestamp(${timestampMs} / 1000)`)}]);

这个方法会让数据库把传入的毫秒数转换成对应的无时区时间戳,结果和客户端时间完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:35