【问题标题】:is there programmatic way to identify date format after reviewing few date strings?在查看几个日期字符串后,是否有编程方式来识别日期格式?
【发布时间】:2019-05-08 04:54:36
【问题描述】:

假设我有一个日期字符串数组,

const a = ["11/23/2018","10/22/1992","02/02/1993","01/01/1990",...];
const b = ["12/01/2018","12/12/1992","24/09/1993","16/01/1990",...];

有没有办法识别每个数组的数据格式,比如

a => MM/DD/YYYY
b => DD/MM/YYYY

在 JavaScript 中。我不是在寻找 vanila javascript 中的解决方案,如果您可以使用 momentjsdate-fns 为我提供解决方案,那很好。

谢谢你,提前。

【问题讨论】:

  • 您可以查看月份和日期部分并检查数字范围以确定哪个月份和哪个日期,但这并不总是适用于秋季的一堆日期在他们几个月的开始。
  • 你怎么能做到这一点,你保证你有足够的数据来识别格式吗?但是为了给你一个答案,我会使用正则表达式来查看所有案例中是否有任何一个月超过 12 个月的案例,如果是,那么它不是一个月..
  • @Pointy 你可以,但它会失败超过三分之一的时间。所以我会说你真的不能。
  • @James 对,基本上没希望了。
  • 无法知道在 2019 年 1 月 3 日输入通用文本字段的人是指 3 月 1 日还是 1 月 3 日。

标签: javascript momentjs date-fns


【解决方案1】:

如cmets中所说,可以使用momentjs Parse Date Format插件。

本插件添加parseFormat方法:

这允许创建智能日期输入,让您的用户设置日期/时间并让您提取用户的首选格式以供将来使用。

parseFormat 方法接受preferredOrder 选项来自定义不明确输入的插件结果。您可以使用preferredOrder 和您自己的逻辑来获得您想要的结果。

这里是一个函数示例,该函数返回数组中最频繁的格式,并以默认parseFormat行为提取:

const a = ["11/23/2018","10/22/1992","02/02/1993","01/01/1990"];
const b = ["12/01/2018","12/12/1992","24/09/1993","16/01/1990"];

function getFormat(arr){
  return arr.map((elem) => moment.parseFormat(elem))
       // get most frequent element from here: https://stackoverflow.com/a/20762713/4131048
        .sort((a,b) =>
          arr.filter(v => v===a).length
        - arr.filter(v => v===b).length
        ).pop();
}

console.log( getFormat(a) );
console.log( getFormat(b) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script>
<script src="https://gr2m.github.io/moment-parseformat/moment-parseformat.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多