Moment.js 转换为日期对象

IT技术 javascript momentjs
2021-02-13 13:38:01

使用 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())
6个回答

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

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

moment().toDate();

产量:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
@gtzinos 你链接和指的是一个单独的问题和场景,例如将字符串传递到构造函数moment("12/12/2011")是你将获得该消息的地方。它与从当下到现在的 obj 无关moment().toDate()
2021-03-19 13:38:01
这实际上是正确答案吗?问题是如何使用 TIMEZONE 将时刻对象转换为 javascript 日期。当更改为 javascript 日期对象时,它仍然恢复到本地时区。
2021-03-20 13:38:01
@Spencer - 是的,它回答了标题,并且toDate确实是如何Datemoment. 但是问题正文中的代码询问了时区转换 - 这Date是不可能的。除非山区时间确实是用户的时区,否则我不确定这是如何回答问题的。
2021-04-07 13:38:01
嘿伙计们检查这个链接momentjs.com/guides/#/warnings/js-date这是不鼓励的,并将在即将发布的主要版本中删除。
2021-04-10 13:38:01
@Matt 这仅取决于您正在查看问题的哪一部分。大多数人搜索谷歌并看到这个标题与他们的问题一致,并为回答标题的答案投票,而不是问题的正文。这可能解释了为什么尽管它在技术上对 OP 没有帮助,但它的投票率最高。
2021-04-14 13:38:01

只要您使用所需区域的数据初始化moment-timezone,您的代码就会按预期工作。

您正确地将时刻转换为时区,这反映在momentObj.format().

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

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

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

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

一些其他的小事情:

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

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

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

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

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

希望这可以帮助

这个答案没有回答这个问题。代码是一种冗长的编写方式moment().add(1, 'd').toDate()
2021-03-26 13:38:01

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

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

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

Safari 不支持格式“YYYY-MM-DD HH:mm:ss”,因此结果为null格式应为“YYYY-MM-DDTHH:mm:ss”(使用 ECMAScript 支持的格式,日期和时间部分之间的“T”)。
2021-03-17 13:38:01
这是直接回答问题的唯一正确答案。
2021-03-21 13:38:01
这正是我想要的。我期望本地日期能够正确表示时区,但遗憾的是我错了。
2021-04-08 13:38:01

这个问题有点晦涩。我会尽力解释这一点。首先,您应该了解如何使用moment-timezone根据这里的答案 TypeError: moment().tz is not a function,您必须从moment-timezone导入 moment而不是默认 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(moment 对象)时,您将获得英国格林威治的时间。有关更多详细信息,请阅读有关 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 会考虑您指定的时区,并将您的当地时间与格林威治时间进行比较,以得出结果。我希望这是有用的。