如何使用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
相关产品推荐
相关产品推荐

