从包含时区的字符串创建时刻日期时忽略时区
Ignoring timezone when creating moment date from string containing timezone
在我的 Angular 项目中,我通过传递包含时区信息的日期字符串来创建时刻对象。
我想删除此信息,并确保此日期始终是同一天,无论我当前所在的时区如何。
我可以像下面这样拆分日期字符串来做到这一点:
let dateString = '2020-12-21T15:00:00+05:00'
let date = moment(dateString.split('T')[0])
但这可能不是正确的做法。下面的代码可以让我存档同样的东西吗?
let date = moment(dateString, YYYY-MM-DD)
在这两种情况下,当我之后显示日期时,我希望看到相同的结果:2020-12-21(无论我当前所在的时区如何):
console.log(date.format(YYYY-MM-DD)) // should always log 2020-12-21
此外,我发现其他帖子我应该使用 utc 方法,但它对我不起作用。我只想完全摆脱时区信息,并在我的时区中创建一个时刻,因为我只对日期而不是时间感兴趣
moment.utc(dateString);
将时间转换为 UTC 时间 (Moment<2020-12-21T18:00:00Z>
)
使用 moment(date, format)
似乎是正确的方法
// fyi, my timezone offset is +7
console.log(moment("2020-12-21T023:00:00+05:00", "YYYY-MM-DD"));
// Moment<2020-12-21T00:00:00+07:00>
它也比 .split
稍快
console.time("format");
moment("2020-12-21T023:00:00+05:00", "YYYY-MM-DD");
console.timeEnd("format");
console.time("split");
moment("2020-12-21T023:00:00+05:00".split("T")[0]);
console.timeEnd("split");
/*
format: 0.475ms
split: 0.662ms
*/
使用 moment.parseZone
代替
let date = moment.parseZone(dateString).format("YYYY-MM-DD");
相当于
let date = moment(dateString).utcOffset(dateString).format("YYYY-MM-DD");
来自 moment docs:
Moment's string parsing functions like moment(string) and moment.utc(string) accept offset information if provided, but convert the resulting Moment object to local or UTC time. In contrast, moment.parseZone() parses the string but keeps the resulting Moment object in a fixed-offset timezone with the provided offset in the string.
但我认为 moment(dateString.split('T')[0])
也是一种正确的方法。它也更快
const dateString = "2020-12-21T23:00:00+05:00";
console.time("parzeZone");
moment.parseZone(dateString);
console.timeEnd("parzeZone");
console.time("moment");
moment(dateString.split("T")[0]);
console.timeEnd("moment");
/*
parzeZone: 4.180ms
moment: 0.356ms
*/
在我的 Angular 项目中,我通过传递包含时区信息的日期字符串来创建时刻对象。
我想删除此信息,并确保此日期始终是同一天,无论我当前所在的时区如何。
我可以像下面这样拆分日期字符串来做到这一点:
let dateString = '2020-12-21T15:00:00+05:00'
let date = moment(dateString.split('T')[0])
但这可能不是正确的做法。下面的代码可以让我存档同样的东西吗?
let date = moment(dateString, YYYY-MM-DD)
在这两种情况下,当我之后显示日期时,我希望看到相同的结果:2020-12-21(无论我当前所在的时区如何):
console.log(date.format(YYYY-MM-DD)) // should always log 2020-12-21
此外,我发现其他帖子我应该使用 utc 方法,但它对我不起作用。我只想完全摆脱时区信息,并在我的时区中创建一个时刻,因为我只对日期而不是时间感兴趣
moment.utc(dateString);
将时间转换为 UTC 时间 (Moment<2020-12-21T18:00:00Z>
)
使用 moment(date, format)
似乎是正确的方法
// fyi, my timezone offset is +7
console.log(moment("2020-12-21T023:00:00+05:00", "YYYY-MM-DD"));
// Moment<2020-12-21T00:00:00+07:00>
它也比 .split
console.time("format");
moment("2020-12-21T023:00:00+05:00", "YYYY-MM-DD");
console.timeEnd("format");
console.time("split");
moment("2020-12-21T023:00:00+05:00".split("T")[0]);
console.timeEnd("split");
/*
format: 0.475ms
split: 0.662ms
*/
使用 moment.parseZone
代替
let date = moment.parseZone(dateString).format("YYYY-MM-DD");
相当于
let date = moment(dateString).utcOffset(dateString).format("YYYY-MM-DD");
来自 moment docs:
Moment's string parsing functions like moment(string) and moment.utc(string) accept offset information if provided, but convert the resulting Moment object to local or UTC time. In contrast, moment.parseZone() parses the string but keeps the resulting Moment object in a fixed-offset timezone with the provided offset in the string.
但我认为 moment(dateString.split('T')[0])
也是一种正确的方法。它也更快
const dateString = "2020-12-21T23:00:00+05:00";
console.time("parzeZone");
moment.parseZone(dateString);
console.timeEnd("parzeZone");
console.time("moment");
moment(dateString.split("T")[0]);
console.timeEnd("moment");
/*
parzeZone: 4.180ms
moment: 0.356ms
*/