【问题标题】:Moment.js formatting incorrect dateMoment.js 格式错误的日期
【发布时间】:2015-10-07 21:07:45
【问题描述】:

我对这里发生的事情感到非常困惑。特别是因为这已经工作了一段时间。我正在使用 v2.10.6。 我正在传递12/02/2015 的日期字符串变量,将其转换为带有moment(eDate,"MM/DD/YYYY"); 的时刻对象 然后我将其传递给另一个函数,该函数将使用eDate.format("dddd, MMMM Do, YYYY") 对其进行格式化 输出Wednesday, November 18th, 2015。见下图。

有人对此有所了解吗?

【问题讨论】:

  • 我无法用你给的东西重现这个。请更新您的问题以包含实际重现您显示的结果的代码。如果可以,也请创建一个 jsFiddle(或类似的)。
  • 我可能会帮助我们查看eDate.format() 函数,因为听起来 Moment.js 做得很好。
  • 哦 - eDate 是字符串吗?或者您是先创建一个名为eDate 的时刻对象,然后再次将其传递给moment(...)?精确的复制在这里会有所帮助。
  • 另外,内部_d 显示的是 11 月 4 日,而不是 11 月 18 日。你传入的也不是(显示在_i),所以你的用法有问题。
  • 不幸的是我无法复制它。 @ZackTanner format() 是一个内置函数 moment.js。 @Matt 是的, edate 以字符串的形式开始它的生命,只将它传递给时刻一次,第二次只是格式化输出。关于差异日期,我知道,我只是不明白问题所在。希望有人在无法复制的情况下有一些见解。也不完全确定_d 代表什么以及为什么它说Invalid Date

标签: javascript date momentjs


【解决方案1】:

我知道发生了什么。我最近添加了一段代码,但没有放入 OP,因为我认为它无关紧要,我认为是错误的。所有时刻都是可变的,这里有关于不可变的讨论https://github.com/moment/moment/issues/1754。我使用的代码与此类似

var theDate = moment(edate,"MM/DD/YYYY"); // edate=12/02/2015 being passed in
_SCHEDULEDPMTDATE = theDate.subtract(cutoff,"days").format("MM/DD/YYYY"); 
// cutoff = 14; i assumed theDate would not be affected.
showNewEventForm(theDate,eventid);

function showNewEventForm(eDate,eid){
    $("#ScheduleDate").text(eDate.format("dddd, MMMM Do, YYYY"));
    // eDate has mutated to eDate-14days
}

所以你需要使用Moment Clone http://momentjs.com/docs/#/parsing/moment-clone/ 声明All moments are mutable. If you want a clone of a moment, you can do so explicitly or implicitly.

我的新行应该是

_SCHEDULEDPMTDATE = theDate.clone().subtract(cutoff,"days").format("MM/DD/YYYY");

【讨论】:

【解决方案2】:

所以你已经发现了 Moment 对象可变性的奇妙之处。

这里有一个更简单的例子来演示这里发生了什么:

var january1 = moment('2015-01-01');
var february1 = january1.add(1, 'months');
var march1 = january1.add(2, 'months');
var april1 = january1.add(3, 'months');

当然,april1 现在指向 7 月 1 日。为什么不呢。

如果您是希望它是 4 月 1 日的人之一,那么您可以使用 Immoment 代替 Moment。就像 Moment 一样,但惊喜更少:

var january1 = immoment('2015-01-01');
var february1 = january1.add(1, 'months');
var march1 = january1.add(2, 'months');
var april1 = january1.add(3, 'months');

现在april1 指向4 月 1 日,有些人可能会觉得不那么令人惊讶。

用法

在浏览器中你可以这样使用它:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<script src="https://cdn.rawgit.com/rsp/node-immoment/v0.0.12/immoment.min.js"></script>

在节点中:

$ npm install --save immoment

和:

var immoment = require('immoment');

或:

var moment = require('immoment');

如果您不想更改已使用对moment() 的调用的现有代码。

性能

Immoment 比 Moment 慢约 3%,请参阅基准:

压缩和压缩后大约有四分之一千字节。

(免责声明:我是 Immoment 的作者。)

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 2014-02-13
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多