代码之家  ›  专栏  ›  技术社区  ›  Glyn

momentjs isValid在应该为true时返回false,反之亦然

  •  0
  • Glyn  · 技术社区  · 7 年前

    使用HTML、javascript和jQuery,我使用“xlsx.full.min.js”从MS excel导入一个日期。我已将MS Excel中的日期字段设置为文本,以便MS Excel在导出时不会更改其格式。导入后,我将解析为验证每个字段而创建的表。要验证我使用的日期字段,请执行以下操作:

    var dateFormat = 'DD/MM/YYYY';
    alert("$(this).text(): " + $(this).text());
    alert(moment(moment($(this).text()).format(dateFormat),dateFormat,true).isValid());
    

    当MS Excel日期字段包含“13/12/2018”时,返回false。当MS Excel日期字段包含“12/13/2018”时,返回true。这两个值都显示在警报中,因此我知道它们被正确传递。

    由于我已将日期格式设置为“DD/MM/YYYY”,为什么该格式会失败而“MM/DD/YYYY”会通过?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Pavish    7 年前

    MomentJS将日期从字符串转换为其对象,然后再对其执行操作。如果未指定格式,则采用默认格式。这里解释了解析操作: https://momentjs.com/docs/#/parsing/string/

    因此,在您的情况下,必须在创建矩对象时传递dateformat。这样地:

    var dateFormat = "DD/MM/YYYY";
    moment("12/13/2018",dateFormat).isValid() //will return false
    moment("13/12/2018",dateFormat).isValid() //will return true
    

    更新:

    MomentJS允许解析日期,即使指定的日期包含格式以外的其他字符。例如,“1A/2B/2018”将被视为“2018年1月2日”的有效日期。

    为了避免这种情况,并检查格式和日期是否完全匹配,矩对象应该传递一个额外的布尔值以启用严格模式。

    moment("1A/2B/2018", dateFormat).isValid() //will return true
    moment("1A/2B/2018", dateFormat, true).isValid() //will return false