Moment.js 格式化日期错误

3
我对这里发生的事情感到非常困惑,特别是因为它已经运行了一段时间。我正在使用v2.10.6。我传递一个日期字符串变量12/02/2015,将其转换为moment对象moment(eDate,"MM/DD/YYYY");。然后我将其传递给另一个函数,该函数将使用eDate.format("dddd, MMMM Do, YYYY")格式化它,输出结果为Wednesday, November 18th, 2015。请参见下面的图片。moment.js formatting weirdness。有人能解释一下吗?

我无法通过你提供的内容重现这个问题。请更新你的问题,包括能够重现你所展示结果的代码。如果可以,请同时创建一个 jsFiddle(或类似的工具)。 - Matt Johnson-Pint
也许看一下eDate.format()函数会对我们有所帮助,因为听起来Moment.js已经很好地完成了它的工作。 - Zack Tanner
哦 - eDate 是一个字符串吗?还是你首先创建了一个名为 eDate 的 moment 对象然后再将其传递到 moment(...) 中?提供一个精确的复现代码会有所帮助。 - Matt Johnson-Pint
此外,内部的 _d 显示的是11月4日,而不是11月18日。同时,你传入的值也不是显示在 _i 中的,因此你的使用方法可能存在问题。 - Matt Johnson-Pint
很遗憾,我无法复制它。@ZackTanner format() 是 moment.js 的内置函数。@Matt 是的,edate 最初是一个字符串,在传递给 moment 之后只使用一次,第二次是为了格式化输出。至于日期差异,我知道,只是不明白问题出在哪里。希望有人能够提供一些见解,尽管无法复制它。同时,我也不太确定 "_d" 代表什么,以及为什么会显示 "Invalid Date"。 - dbinott
不用担心前缀为 _ 的内部值。我只是看它们,因为那是你所展示的全部内容。通常情况下,你不应该使用它们。 - Matt Johnson-Pint
2个回答

3

我弄清楚了发生了什么。有一段代码是我最近添加的,没有放在原始帖子中,因为我认为它与问题无关,但我错了。所有时刻都是可变的,这里有关于不可变性的讨论 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/,该页面说明了 所有的时间点都是可变的。如果您想要一个时间点的克隆,可以明确或隐式地执行此操作。

您新的一行应该是

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


是的,或者隐式地写成 moment(theDate).subtract.... 两种方式都可以。另请参见:https://dev59.com/82Qm5IYBdhLWcg3wyhfk#17334415 - Matt Johnson-Pint

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>

在Node中:

$ npm install --save immoment

并且:

var immoment = require('immoment');

或者:

var moment = require('immoment');

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

性能

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

这个文件经过压缩和gzip处理后,大小只有四分之一千字节。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接