我对这里的情况感到非常困惑。特别是因为这已经工作了一段时间。我使用的是v2.10.6。
我传递的日期字符串var 12/02/2015
将其转换为moment(eDate,"MM/DD/YYYY");
的时刻对象
然后我将其传递给另一个函数,该函数将使用eDate.format("dddd, MMMM Do, YYYY")
格式化它
输出Wednesday, November 18th, 2015
。见下图。
有没有人对此有所了解?
答案 0 :(得分:3)
我弄清楚发生了什么事。我最近添加了一段代码并没有放入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");
答案 1 :(得分:0)
所以你已经发现了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()
来电的现有代码。
Immment比Moment慢约3%,见基准:
大约四分之一千字节缩小并压缩。
(免责声明:我是Immoment的作者。)