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())
951408 次浏览

只要你用您想要的区域的数据初始化了时刻时区,你的代码就会按预期工作。

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

切换到UTC不仅仅是删除偏移量,它会变回UTC时区。如果你要这样做,你根本不需要原始的.tz()调用。你可以只做moment.utc()

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

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

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

还有一些其他的小事:

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

  • MST7MDT这样的时区是出于向后兼容的原因。它们源于POSIX风格的时区,其中只有少数在TZDB数据中。除非绝对必要,否则您应该使用像America/Denver这样的键。

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

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

moment().toDate();

产量:

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

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

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

希望这有助于

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

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

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

时刻更新了截至06/2018的js lib。

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:00losAngeles.format(); // 2014-06-01T09:00:00-07:00london.format();     // 2014-06-01T17:00:00+01:00

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

由于Momjs无法控制javascript date对象,我找到了一个解决这个问题的方法。

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

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

let dateVar = moment('any date value');let newDateVar = dateVar.utc().format();

漂亮干净!!!!

try(没有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>

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

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

这个问题有点模糊。我会尽力解释这个。首先你应该了解如何使用时刻时区。根据这里的答案TypeError:矩(). tz不是函数,你必须从时刻时区而不是缺省矩导入时刻(当然你必须首先npm安装时刻-时区!)。为了清楚起见,

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

现在为了使用时区功能,请使用moment.tz("date_string","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.*/

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

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

新的日期(时刻())-在Excel中导出数据列时可能出错

使用

moment.to日期()-不会给出错误或使导出的文件损坏