Moment.js转换为日期对象

时间:2013-08-01 07:25:26

标签: javascript momentjs

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

10 个答案:

答案 0 :(得分:1005)

使用此选项将矩形对象转换为日期对象:

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

moment().toDate();

收率:

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

答案 1 :(得分:44)

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

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

切换到UTC不仅会丢弃偏移量,而是会更改回UTC时区。如果您要这样做,则根本不需要原始的.tz()电话。你可以moment.utc()

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

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

关于代码的最后几行 - 当您使用Date返回toDate()对象时,您放弃了moment.js的行为并回到JavaScript的行为。 JavaScript Date对象将始终打印在其运行的计算机的本地时区中。没有什么时刻.js可以做到这一点。

其他一些小事:

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

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

  • 等密钥

答案 2 :(得分:20)

.toDate并不适合我,所以,这就是我所做的:

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

希望这会有所帮助

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

干净整洁!!!!

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

尝试(不执行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>

答案 9 :(得分:0)

这个问题有点晦涩。我会尽力解释这一点。首先,您应该了解如何使用 moment-timezone 。根据此处的答案TypeError: moment().tz is not a function,您必须从 moment-timezone 导入矩,而不是默认矩(当然,您必须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 ,以您当下的对象为准。为了清楚起见,

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