将 ISO 字符串转换为 Date 对象 javascript 而不格式化为本地日期
Transform ISO string to Date object javascript without format to local date
我正在尝试将字符串 2022-02-01T13:36:57+00:00
转换为 returns 我 Tue Feb 01 2022 13:36:57
的日期对象 javascript,而不考虑时区。
但每次我尝试转换日期时 returns:
Tue Feb 01 2022 10:36:57 GMT-0300 (Brasilia Standard Time)
我已经尝试过 moment:
let now = moment("2022-02-01T13:36:57+00:00").toDate();
日期:
let now = new Date("2022-02-01T13:36:57+00:00");
也使用 UTC:new Date(Date.UTC(2022, 02, 01, 10, 36, 57))
但所有这些 returns 我都是当地时间(巴西利亚标准时间)
所以,问题是:
如何将此字符串 2022-02-01T13:36:57+00:00
转换为保持同一天、同一小时等的日期对象?
您可以实例化您自己的 Intl.DateTimeFormat
formatter, or call Date.prototype.toLocaleString()
。
const
dateString = '2022-02-01T13:36:57+00:00',
date = new Date(dateString),
dateFormatter = new Intl.DateTimeFormat('en-US', {
timeZone: 'UTC',
weekday: 'short',
year: 'numeric',
month: 'short',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
timeZoneName: 'long',
hour12: false
});
console.log(`Local date : ${date}`);
console.log(` UTC date : ${dateFormatter.format(date).replace(/,/g, '')}`);
时间戳“2022-02-01T13:36:57+00:00”代表一个独特的时刻。如果解析为 Date 对象,它将创建一个时间值为 1643722617000 的 Date 实例,这是与 1970 年 1 月 1 日的 ECMAScript 纪元的偏移量(以毫秒为单位)。
时间戳产生的时间值不受本地设置影响:
- 它符合ECMA-262支持的格式之一,因此解析是由标准指定的
- 包含固定偏移量
默认的 toString 方法为主机系统时区中的等效日期和时间生成时间戳,通常称为本地日期和时间。它会为每个具有不同偏移量的主机生成不同的日期和时间,但它们都将代表完全相同的时间。
例如
let timestamp = '2022-02-01T13:36:57+00:00';
let date = new Date(timestamp);
['UTC','America/Sao_Paulo','Asia/Kolkata'].forEach(
loc => console.log(`${date.toLocaleString('default',{timeZone:loc})} - ${loc}`)
)
如果您希望将时间戳解析为本地时间戳(并且只有当您知道自己在做什么并且有充分的理由这样做时才应该这样做)然后删除偏移量并解析其余部分:
let timestamp = '2022-02-01T13:36:57+00:00';
let date = new Date(timestamp.substring(0,19));
console.log(date.toString());
请注意,对于具有不同偏移量的每个主机,生成的日期表示不同的时间时刻,并且每个此类日期实例将具有不同的时间值。
我正在尝试将字符串 2022-02-01T13:36:57+00:00
转换为 returns 我 Tue Feb 01 2022 13:36:57
的日期对象 javascript,而不考虑时区。
但每次我尝试转换日期时 returns:
Tue Feb 01 2022 10:36:57 GMT-0300 (Brasilia Standard Time)
我已经尝试过 moment:
let now = moment("2022-02-01T13:36:57+00:00").toDate();
日期:
let now = new Date("2022-02-01T13:36:57+00:00");
也使用 UTC:new Date(Date.UTC(2022, 02, 01, 10, 36, 57))
但所有这些 returns 我都是当地时间(巴西利亚标准时间)
所以,问题是:
如何将此字符串 2022-02-01T13:36:57+00:00
转换为保持同一天、同一小时等的日期对象?
您可以实例化您自己的 Intl.DateTimeFormat
formatter, or call Date.prototype.toLocaleString()
。
const
dateString = '2022-02-01T13:36:57+00:00',
date = new Date(dateString),
dateFormatter = new Intl.DateTimeFormat('en-US', {
timeZone: 'UTC',
weekday: 'short',
year: 'numeric',
month: 'short',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
timeZoneName: 'long',
hour12: false
});
console.log(`Local date : ${date}`);
console.log(` UTC date : ${dateFormatter.format(date).replace(/,/g, '')}`);
时间戳“2022-02-01T13:36:57+00:00”代表一个独特的时刻。如果解析为 Date 对象,它将创建一个时间值为 1643722617000 的 Date 实例,这是与 1970 年 1 月 1 日的 ECMAScript 纪元的偏移量(以毫秒为单位)。
时间戳产生的时间值不受本地设置影响:
- 它符合ECMA-262支持的格式之一,因此解析是由标准指定的
- 包含固定偏移量
默认的 toString 方法为主机系统时区中的等效日期和时间生成时间戳,通常称为本地日期和时间。它会为每个具有不同偏移量的主机生成不同的日期和时间,但它们都将代表完全相同的时间。
例如
let timestamp = '2022-02-01T13:36:57+00:00';
let date = new Date(timestamp);
['UTC','America/Sao_Paulo','Asia/Kolkata'].forEach(
loc => console.log(`${date.toLocaleString('default',{timeZone:loc})} - ${loc}`)
)
如果您希望将时间戳解析为本地时间戳(并且只有当您知道自己在做什么并且有充分的理由这样做时才应该这样做)然后删除偏移量并解析其余部分:
let timestamp = '2022-02-01T13:36:57+00:00';
let date = new Date(timestamp.substring(0,19));
console.log(date.toString());
请注意,对于具有不同偏移量的每个主机,生成的日期表示不同的时间时刻,并且每个此类日期实例将具有不同的时间值。