使用 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”通过?
最佳答案
MomentJS 在对其执行操作之前将日期从字符串转换为其对象。如果未指定格式,则采用默认格式。解析操作解释如下:https://momentjs.com/docs/#/parsing/string/
因此,在您的情况下,您必须在创建 moment 对象时传递日期格式。像这样:
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”将被视为有效日期“1/2/2018”。
为了避免这种情况,并检查格式和日期是否完全匹配,应向 moment 对象传递一个附加 bool 值以启用严格模式。
moment("1A/2B/2018", dateFormat).isValid() //will return true
moment("1A/2B/2018", dateFormat, true).isValid() //will return false
关于javascript - momentjs isValid 在应该为 true 时返回 false,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53589252/