我的 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)
})();
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
例如
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 是一种时间标准,而不是一种格式。 ;-)