844

使用 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

11 回答 11

1503

Use this to transform a moment object into a date object:

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

moment().toDate();

Yields:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
于 2014-11-04T20:06:33.373 回答
62

只要您使用所需区域的数据初始化了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.

于 2013-08-01T13:14:02.823 回答
27

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

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

希望这可以帮助

于 2015-03-13T10:04:39.637 回答
23

由于 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 日期对象

于 2018-09-26T04:24:03.207 回答
9

这个问题有点模糊。我会尽力解释这一点。首先,您应该了解如何使用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.*/

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

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 会考虑您指定的时区,并将您的本地时间与格林威治的时间进行比较,从而为您提供结果。我希望这很有用。

于 2019-11-06T13:38:32.370 回答
7

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

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()
于 2019-10-18T13:49:23.787 回答
5
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

又好又干净!!!!

于 2019-02-17T17:20:33.253 回答
4

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

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

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

于 2016-03-19T04:35:11.153 回答
3

尝试(无format步骤)

new Date(moment())

var d = moment.tz("2019-04-15 12:00", "America/New_York");

console.log( new Date(d) );
console.log( new Date(moment()) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.min.js"></script>

于 2019-04-16T04:10:07.087 回答
2

自 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。

于 2018-06-13T16:12:35.720 回答
0

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

利用

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

于 2021-10-27T08:17:15.417 回答