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

如何在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);

关键说明

  1. 读取UTC字段:用getUTCHours()、getUTCDay()、getUTCMonth()替代getHours()、getDay()、getMonth(),直接获取UTC时区下的时间字段值。
  2. UTC时间加减:如果要进行时间加减操作,使用UTC系列的设置方法,比如:
    // UTC时间加2小时
    date.setUTCHours(date.getUTCHours() + 2);
    // UTC时间加1天
    date.setUTCDate(date.getUTCDate() + 1);
    
    这样操作不会受本地时区影响,完全基于UTC时间进行计算。
  3. 格式化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:08:20