【问题标题】:Moment automatically corrects invalid dates when setting oneMoment 在设置一个时自动更正无效日期
【发布时间】:2016-08-04 04:41:03
【问题描述】:

我通过从输入中捕获日期、月份和年份来使用时刻库​​设置日期:

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

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

有人知道防止这种奇怪的行为吗? :)

【问题讨论】:

    标签: javascript html date momentjs


    【解决方案1】:

    这里发生了一些事情。首先,“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

    【讨论】:

    • 感谢您的回答 :) 但是要将 userDate 与另一个日期进行比较,时间会有所不同,所以我不能使用日期
    • 我需要澄清一下。您是要根据日期比较两个时刻,还是要验证输入没有溢出?两者都可以,我只需要知道更多来回答你的问题。
    • 我正在尝试两者都做^^
    【解决方案2】:

    月份从0开始,设置日期时加1即可:

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

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多