首页 > 解决方案 > 在Javascript中更改日期时区?

问题描述

我有一个UTC格式的日期`2020-06-19T03:55:12.000Z。现在我正在转换为美国时区的日期

let syncDate = moment(date, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]')
    .subtract(7, 'hours')
    .format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');

这给了我一个比美国日期晚 7 小时的日期。但我想要以下格式的日期

2020-06-18T21:00:24.523-07:00 

在这里,如果我们可以看到小时被定义为 -7 那么请指导我们如何实现相同的目标?

标签: javascriptnode.jsdatetypesmomentjs

解决方案


您无法从日期中提取时区,因为其中没有时区信息。你说“我正在转换为美国时区的日期”但你没有。你只是减少了7个小时。时区仍然是 UTC。

您应该使用moment-timezone(而不是像@GetSet 所说的那样手动处理事情)。这里的解决方案:

const moment = require('moment'); 
const tz = require('moment-timezone');

let date = moment('2020-06-19T03:55:12.000Z');
let syncDate = date.tz('America/Los_Angeles')
console.log(syncDate.format());

但是,我建议你使用Day.js. 代码将是:

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);

const dDate = dayjs('2020-06-19T03:55:12.000Z');

console.log(dDate.utcOffset(-7*60).format()); //2020-06-18T20:55:12-07:00

moment.js以前用过。我试Date-fnd了24小时。最后,我搬到了Day.js。它是新的(从 2018 年底开始),但发展得如此之快(看看这个链接并将持续时间设为 5 年)。它的伟大之处在于“它总是按照它说的去做”。Moment 和 Date-fns 没有。(不总是)。它使用包装器,因此您永远不会直接使用 Date 对象。它解决了困难和问题。它是不可变的,并且总是返回一个新对象,您可以链接函数。Day.js 具有最小的大小 (2kB)。文档很棒,您可以非常快速地启动和运行。(其他库的工作方式更容易理解。)

在这里我不得不说,Dayjs性能在计算上不如 Moment,但在解析和格式化方面要好得多(尤其是比 Moment)。

我强烈建议你阅读这篇文章:为什么你不应该使用 Moment.js


编辑(1):正如@GetSet 在 OP 的评论中提到的可能需要 Moment.js 中的解决方案,我将其添加到答案中。

编辑(2):添加您无法以 OP 解决方法的方式实现结果的原因。


推荐阅读