这里发生了一些事情。首先,“day”是“星期几”的词,而不是“月份的日期”。我认为您正在寻找“约会”。它不直观。
接下来,setter 在时刻溢出到下一个单元。在 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() 与日期一起使用:
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-set/day/
如果您想要更完整的解释,请随时发表评论,我会详细介绍。我认为主要你需要知道的是你应该使用date。