ChatGPT解决这个技术问题 Extra ChatGPT

Moment.js 转换为日期对象

使用 Moment.js 我无法将正确的时刻对象转换为带有时区的日期对象。我无法得到正确的日期。

例子:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())
你期望什么输出,你得到什么输出?
4 行让我如此输出:(日期对象)Time with offset Thu Aug 01 2013 15:23:49 GMT+0300 (Финляндия (лето)) 但时区必须是 MST7MDT
Wednesday 24th 2019, 12:47:48 am 这可以转换成 2019-04-23T19:17:48.000Z 吗? @vadim.zhiltsov
日期对象没有时区,它们只是 1970-01-01T00:00:00Z 的偏移量。因此,当您调用 toDate 时,返回的对象丢失了您使用 .tz("MST7MDT") 附加到时刻对象的时区信息。这就是为什么像 moment.tz 这样的库存在的原因,以补充内置 Date 对象的基本功能,它只理解 UTC 和主机时区,就是这样。

J
Josh Hunt

使用它来将时刻对象转换为日期对象:

来自http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

产量:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

@Spencer - 是的,它回答了标题,toDate 确实是如何从 moment 获取 Date 对象。但问题正文中的代码询问时区转换 - Date 无法做到。除非山地时间确实是用户的时区,否则我不确定这是如何回答这个问题的。
@Matt 仅取决于您正在查看问题的哪一部分。大多数人在谷歌上搜索,看到这个标题与他们的问题一致,并赞成回答标题的答案,而不是问题的主体。这可能解释了为什么它有最多的支持,即使它在技术上对 OP 没有帮助。
这实际上是正确的答案吗?问题是如何将时刻对象转换为 javascript 日期但使用 TIMEZONE。当更改为 javascript 日期对象时,它仍会恢复到本地时区。
大家好,请检查此链接 momentjs.com/guides/#/warnings/js-date。这是不鼓励的,将在即将发布的主要版本中删除。
@gtzinos 您链接和引用的是一个单独的问题和场景,例如将字符串传递到构造函数 moment("12/12/2011") 是您将获得该消息的地方。它与时不时的 obj moment().toDate() 无关
M
Matt Johnson-Pint

只要您使用 the data for the zones you want 初始化了 moment-timezone,您的代码就会按预期工作。

您正确地将时刻转换为时区,这反映在 momentObj.format() 的第二行输出中。

切换到 UTC 不仅会降低偏移量,还会更改回 UTC 时区。如果您要这样做,则根本不需要原来的 .tz() 调用。你可以做moment.utc()

也许您只是想更改输出格式字符串?如果是这样,只需为 format 方法指定您想要的参数:

momentObj.format("YYYY-MM-DD HH:mm:ss")

关于代码的最后一行 - 当您使用 toDate() 返回到 Date 对象时,您将放弃 moment.js 的行为并返回 JavaScript 的行为。 JavaScript Date 对象将始终以运行它的计算机的本地时区打印。 moment.js 对此无能为力。

其他几件小事:

虽然构造函数可以使用 Date,但通常最好不要使用 Date。对于“现在”,不要使用 moment(new Date())。相反,只需使用 moment()。两者都可以工作,但它是不必要的冗余。如果您正在从字符串解析,请将该字符串直接传递给 moment.不要尝试先将其解析为 Date 。您会发现 moment 的解析器更加可靠。

出于向后兼容性的原因,存在诸如 MST7MDT 之类的时区。它们源于 POSIX 风格的时区,并且只有少数在 TZDB 数据中。除非绝对必要,否则您应该使用诸如 America/Denver 之类的密钥。


谢谢马特!你的回答很有用。正如您提到的使用 America/Denver 而不是 MST7MDT,是否有可用于这些映射的地图?我正在使用很多这样的时区,例如 CET、EET、EST5EDT、CST6CDT、PST8PDT。
是否可以将例如:“10:20 AM”(从 moment().format('hh:mm A') 获得的字符串时间)转换为 Date 对象?
@ram - 1) 如果你有时间,只需使用 .toDate()。 2) 不要使用评论来提出新问题。这就是大 "Ask Question" 按钮的用途。
这是我使用日期所需要的。我还需要更改时区,谢谢
M
Mo.

.toDate 并没有真正为我工作,所以,这就是我所做的:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

希望这可以帮助


这个答案没有回答问题。该代码是写 moment().add(1, 'd').toDate() 的冗长方式。
Y
Yasith Prabuddhaka

由于 momentjs 无法控制 javascript 日期对象,因此我找到了解决此问题的方法。

const currentTime = new Date(); const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");常量转换时间对象 = 新日期(转换时间);

这将为您提供一个带有转换时间的 javascript 日期对象


Safari 不支持“YYYY-MM-DD HH:mm:ss”格式,因此结果为空。格式应为“YYYY-MM-DDTHH:mm:ss”(使用 ECMAScript 支持的格式,在日期和时间部分之间使用“T”)。
V
Vijay Joshua Nadar

这个问题有点模糊。我会尽力解释这一点。首先你应该了解如何使用moment-timezone。根据这里的答案TypeError: moment().tz is not a function,您必须从 moment-timezone 而不是 default moment 导入时刻(当然,您必须先 npm install moment-timezone! )。为清楚起见,

const moment=require('moment-timezone')//import from moment-timezone

现在要使用时区功能,请使用 moment.tz("date_string/moment()","time_zone")(访问 https://momentjs.com/timezone/ 了解更多详情)。此函数将返回具有特定时区的时刻对象。为清楚起见,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

现在,当您尝试使用 moment 的 toDate()(ISO 8601 格式转换)转换 newYork(时刻对象)时,您将获得英国格林威治的时间。有关更多详细信息,请阅读这篇关于 UTC 的文章 https://www.nhc.noaa.gov/aboututc.shtml。但是,如果您只想要这种格式的本地时间(根据此示例,纽约时间),只需添加方法 .utc(true) ,并带有 arg true , 到你的时刻对象。为清楚起见,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

简而言之,moment.tz 会考虑您指定的时区,并将您的本地时间与格林威治的时间进行比较,从而为您提供结果。我希望这很有用。


这是唯一正确的答案。更简单的代码是 moment().tz("Asia/Shanghai").utc(true).toDate()。它将给出日期,例如,上海当地时间 2022-03-29T23:09:21.452Z。
k
kizoso

要转换任何日期,例如 UTC:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

这个答案是错误的。它两次应用时区偏移量:moment().utc() 返回 UTC 值,然后 .format( "YYYY-MM-DD HH:mm:ss" ) 返回已设置为 UTC 且没有时区偏移量的字符串,因此被解析为本地。它与默认的时刻格式不匹配,因此由内置解析器解析。它也不匹配任何 ECMAScript 支持的格式,因此解析依赖于实现。无论如何,它被解析为本地,因此在创建日期的时间值时再次应用时区偏移量。
E
Emerson Bottero
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

又好又干净!!!!


c
chovy

我需要在我的日期字符串中有时区信息。我最初使用的是 moment.tz(dateStr, 'America/New_York').toString();,但后来我开始收到关于将该字符串反馈回时刻的错误。

我尝试了 moment.tz(dateStr, 'America/New_York').toDate();,但后来丢失了我需要的时区信息。

返回可反馈到时刻的可用日期字符串with timezone的唯一解决方案是moment.tz(dateStr, 'America/New_York').format();


K
Kamil Kiełczewski

尝试(没有 format 步骤)

new Date(moment())

var d = moment.tz("2019-04-15 12:00", "America/New_York");控制台.log(新日期(d));控制台日志(新日期(时刻()));


new Date(moment()) 等同于 new Date()。时区仅为 d 设置。
F
Feng Zhang

自 2018 年 6 月起,moment 已更新 js 库。

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

如果您可以自由使用 Angular5+,那么最好在此处使用 datePipe 功能而不是此处的时区功能。我必须使用 moment.js,因为我的项目仅限于 Angular2。


A
Anmol K.

new Date(moment()) - 在 excel 中导出数据列时可能会出错

利用

moment.toDate() - 不给出错误或使导出的文件损坏