如何在JavaScript中将PostgreSQL带时区时间戳转为UTC
问题
我的PostgreSQL表在客户端返回的日期值格式如下:2024-05-14 15:11:38.208073+00
其中+00表明该时间戳以UTC格式正确存储。我需要将其转换为JavaScript中可操作的Date对象,以便自由进行时间加减。
目前使用的代码如下:
const date = new Date(item.time); const formattedDate = date.toISOString().split('T')[0]; const hour = ('0' + date.getHours()).slice(-2) + ':00'; // 格式化小时为00:00格式 const dayOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getDay()]; const monthName = date.toLocaleString('default', { month: 'long' });
这段代码技术上可以运行,但问题在于new Date(item.time)会自动将UTC时间戳转换为我的本地时区(EST),导致后续获取的时间字段都是本地时区的值,无法保留UTC格式。搜了一个多小时没找到清晰靠谱的解决方案,求帮助!
编辑1:
已确认new Date(item.time)确实会将传入的UTC时间戳转换为本地时间,测试代码及结果如下:
测试代码1:
console.log("TIME BEFORE: " , item.time) const date = new Date(item.time); console.log("TIME AFTER: ", date)
输出:
TIME BEFORE: 2024-05-14T13:27:24.357094+00:00 TIME AFTER: Tue May 14 2024 09:27:24 GMT-0400 (Eastern Daylight Time)
测试代码2:
(()=>{ const startDate = "2024-05-14 15:11:38.208073+00" console.log("TIME BEFORE: " , startDate) const date = new Date(startDate); console.log("TIME AFTER: ", date) })();
解决方案
首先要明确:JavaScript的Date对象本质上存储的是UTC时间戳(从1970-01-01 UTC开始计算的毫秒数),不存在“被转换为本地时区”的问题——只是调用getHours()、getDay()这类方法时,默认会返回转换为本地时区后的数值。要操作UTC时间,核心是使用UTC系列的方法来读取和修改时间字段。
修改后的代码示例
const date = new Date(item.time); // 获取UTC日期部分(toISOString返回的是UTC格式,直接拆分即可) const formattedDate = date.toISOString().split('T')[0]; // 获取UTC小时并格式化 const hour = ('0' + date.getUTCHours()).slice(-2) + ':00'; // 获取UTC星期几 const dayOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getUTCDay()]; // 获取UTC对应的月份名称(指定时区为UTC) const monthName = new Intl.DateTimeFormat('default', { month: 'long', timeZone: 'UTC' }).format(date);
关键说明
- 读取UTC字段:用
getUTCHours()、getUTCDay()、getUTCMonth()替代getHours()、getDay()、getMonth(),直接获取UTC时区下的时间字段值。 - UTC时间加减:如果要进行时间加减操作,使用UTC系列的设置方法,比如:
这样操作不会受本地时区影响,完全基于UTC时间进行计算。// UTC时间加2小时 date.setUTCHours(date.getUTCHours() + 2); // UTC时间加1天 date.setUTCDate(date.getUTCDate() + 1); - 格式化UTC输出:除了
toISOString(),还可以用Intl.DateTimeFormat并指定timeZone: 'UTC',生成自定义格式的UTC时间字符串,比如:const utcFormatted = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', timeZone: 'UTC' }).format(date); // 输出示例:May 14, 2024, 15:11
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

