繁体   English   中英

Moment.js 转换为日期对象

[英]Moment.js transform to date object

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

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

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

moment().toDate();

产量:

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

只要您使用所需区域的数据初始化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类的密钥。

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

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

希望这可以帮助

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

这个问题有点晦涩。 我会尽力解释这一点。 首先,您应该了解如何使用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 会考虑您指定的时区,并将您的当地时间与格林威治时间进行比较,以得出结果。 我希望这是有用的。

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

漂亮干净!!!!

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

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

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

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

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

尝试(没有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>

截至 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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM