如何在Javascript中将带时区的Postgresql时间戳转换为UTC

问题描述 投票:0回答:1

我的 postgres 表返回一大堆客户端格式的日期值,如下所示:

2024-05-14 15:11:38.208073+00

显然,

+00
表示这是(正确)以UTC格式存储的。

从这里开始,我需要做的就是将此时间戳转换为 Javacript 中的可用日期对象,这样我就可以根据需要添加/减去时间。

目前我正在尝试这个:

        const date = new Date(item.time);
        const formattedDate = date.toISOString().split('T')[0];
        const hour = ('0' + date.getHours()).slice(-2) + ':00'; // Formatting hour to display as 00:00
        const dayOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getDay()];
        const monthName = date.toLocaleString('default', { month: 'long' });

从技术上讲,这一切都有效。然而问题是

new Date(item.time)
会自动将时间戳转换为 EST(我的本地时区),而不是保持
UTC
格式。

这看起来应该很简单,但是我已经研究了一个明确的解决方案一个多小时了,但没有成功(那里的一切看起来都像是黑客)。

任何帮助将不胜感激!

编辑1: 我可以看到,事实上,

new Date(item.time)
正在将传入的 UTC 时间戳转换为我的本地时间。像这样测试:

 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)

这样测试:

(()=>{
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)
})();

enter image description here

javascript datetime
1个回答
0
投票

ECMA-262 不支持传递给内置解析器的时间戳(它在日期和时间部分之间有一个空格而不是字母“T”,并且小数秒部分中有太多数字),因此解析是依赖于实现。

如果正确解析(并且不能保证这一点,请参见上文),它将转换为距 ECMAScript 纪元的毫秒偏移量,即 1970-01-01T00:00:00.000Z(即 1970 年 1 月 1 日开始的午夜)世界标准时间)。 ECMA-262 将该值称为“时间值”。它代表时间上的单个时刻,并且是 Date 实例保存的唯一数据值。 Date

实例的各种

toString方法根据时间值生成时间戳,这些时间戳都表示同一时刻,但根据所使用的偏移量,显示的日期和时间可能有不同的值。在OP中,以下时间戳: 2024-05-14T13:27:24.357094+00:00

    2024 年 5 月 14 日星期二 09:27:24 GMT-0400(东部夏令时间)
  1. 表示完全相同的时刻(除了第二个时间戳中缺少小数秒)。显示时间的差异是时间戳使用不同偏移量的结果。这并不是因为
  2. Date
实例本身具有关联的偏移量或时区。

例如

let d = new Date('2024-05-14T15:11:38.208+00'); // Return a timestamp the same as the initial string console.log(d.toISOString()); // Return a timestamp for the system's current regional settings console.log(d.toLocaleString('en-ca')); // Return a timestamp for Auckland, New Zealand console.log(d.toLocaleString('en-ca',{ timeZone:'Pacific/Auckland', timeZoneName:'short' }));

PS

UTC 是一种时间标准,而不是一种格式。 ;-)

© www.soinside.com 2019 - 2024. All rights reserved.