Moment会在设置日期时自动更正无效日期

Moment automatically corrects invalid dates when setting one

本文关键字:日期 无效 设置 Moment      更新时间:2024-06-18

我通过捕捉、日期、月份和年份从输入中设置日期和时刻库:

var userDate = moment().set({ 'year': oTextY.innerHTML, 'month': oTextMi.innerHTML - 1, 'day': oTextDi.innerHTML });

如果在输入中我指定2005年2月31日,它会给我2005年3月16日的

有人想阻止这种奇怪的行为吗?:)

这里发生了一些事情。首先,"day"是"day of week"的意思,而不是"date of month"。我想你在找"约会对象"。这不是直观的。

接下来,瞬间的二传手溢出进入下一个单元。在2005年,2月有28天,所以当你试图设置为2月31日时,设置操作将以额外的天数溢出到下个月,结果日期将是2005-03-03。

因此,您更正的代码将是:

var userDate = moment().set({ 'year': oTextY.innerHTML, 
'month': oTextMi.innerHTML - 1, 'date': oTextDi.innerHTML });

您的预期输出是:

"2005-03-03T07:25:36-06:00"

尽管偏移量当然是你电脑的本地值,而不是我的。

听起来好像您正在尝试验证日期输入,然后将其与另一个日期进行比较。在这种情况下,可能最简单的事情就是将输入解析为字符串:

moment(oTextY.innerHTML + '-' + oTextMi.innerHTML + '-' + oTextDi.innerHTML,
'YYYY-MM-DD') 

你会注意到,如果你通过你提供的输入,你会得到无效的日期:

moment(2005 + '-' + 2+ '-' + 31,
'YYYY-MM-DD').isValid()
false

如果你需要将这个时刻与另一个时刻进行比较,不管时间如何,只需将isSame()与day一起使用即可:

var a = moment(oTextY.innerHTML + '-' + oTextMi.innerHTML + '-' + oTextDi.innerHTML,
'YYYY-MM-DD') 
a.isSame(moment(), 'day') //api uses day here because inconsistency is what programmers do

至于为什么当你使用day而不是date时,你会得到第16个。这与一周中某一天的时间溢出方式有关。这有点复杂,但在这里的文档中解释得相当好:http://momentjs.com/docs/#/get-台/天/

如果你想要一个更完整的解释,请随时回复,我会仔细阅读。我认为你需要知道的主要是你应该使用date

月份从0开始,您可以在设置日期时添加1:

var userDate = moment().set({ 'year': oTextY.innerHTML, 'month': oTextMi.innerHTML + 1, 'day': oTextDi.innerHTML });