【问题标题】:Date parse in javascriptjavascript中的日期解析
【发布时间】:2021-12-31 07:37:28
【问题描述】:

我需要将 17Dec2010 的 javascript 日期解析为 javascript 日期。 该怎么做?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    简短的回答是:在 JavaScript 中没有标准的方法可以做到这一点,你必须自己做。 JavaScript 最近才获得any 日期的标准字符串表示(从 ECMAScript 第 5 版开始,大约一年前 - 格式是 ISO-8601 的简化版本),而您的格式与该格式不匹配.

    但是,有一些附加库可以提供帮助,例如 DateJS

    您的特定格式很容易解析(见下文),但如果您遇到变体,它会很快变得复杂。

    简单示例:

    var months = {
        en: {
            "jan": 0,
            "feb": 1,
            "mar": 2,
            "apr": 3,
            "may": 4,
            "jun": 5,
            "jul": 6,
            "aug": 7,
            "sep": 8,
            "oct": 9,
            "nov": 10,
            "dec": 11
        }
    };
    var dateString = "17Dec2010";
    var dt = new Date(
        parseInt(dateString.substring(5), 10),               // year
        months.en[dateString.substring(2, 5).toLowerCase()], // month
        parseInt(dateString.substring(0, 2), 10)             // day
    );
    alert(dt); // alerts "Fri Dec 17 2010 00:00:00 GMT+0000 (GMT)" or similar
    

    Live example

    ...但它只处理英语(因此monthsen 属性),而且它会很快变得复杂。


    mplungjan 非常正确地指出上述操作将失败,例如“7Dec2010”。这是一个更灵活的版本,但如果格式有任何变化,我可能会再看一个库:

    var months = {
        en: {
            "jan": 0,
            "feb": 1,
            "mar": 2,
            "apr": 3,
            "may": 4,
            "jun": 5,
            "jul": 6,
            "aug": 7,
            "sep": 8,
            "oct": 9,
            "nov": 10,
            "dec": 11
        }
    };
    var dateString = "17Dec2010";
    var parts = /^(\d+)(\D+)(\d+)$/.exec(dateString);
    if (parts && parts.length == 4) {
      var dt = new Date(
          parseInt(parts[3], 10),            // year
          months.en[parts[2].toLowerCase()], // month
          parseInt(parts[1], 10)             // day
      );
      display(dt);
    }
    else {
      display("Date '" + dateString + "' not recognized");
    }
    

    Live example

    【讨论】:

    • @mplugjan:就像我说的那样,复杂性......但你说得对,用正则表达式而不是子字符串来分解事情很容易——我不妨更新一下。 ..(编辑:完成)
    • 太棒了。我错过了 () 来捕获零件。我的名字是 mplungjan btw ;)
    • @mplungjan:对不起,我两次都错过了“g”,不是吗?
    • @mplungjan:是的。 :-)(我也不能。)
    【解决方案2】:

    使用 Crowder 的 regExp 而不是我第一次回答时想出的那个,不需要月份数组。我的脚本在 Windows 和黑莓本机浏览器上的 IE8、Fx 3.6、Opera 10、Safari 5、Mozilla 1.7 中进行了测试。如果字符串的月份部分是英文,那么所有主要的浏览器,甚至一些不太主要的浏览器 - 我希望所有支持 javascript 和 Date.parse 支持的浏览器都能很好地处理我的脚本。 MDC 说 Date.parse 执行 RFC822

    <script type="text/javascript">
    var date = "12Dec2011"
    var reg = /^(\d+)(\D+)(\d+)$/
    var parts = reg.exec(date)
    var dateString = parts[1]+' '+parts[2]+' '+parts[3]; // parts[0] is the match itself
    alert(new Date(Date.parse(dateString)))
    </script>
    

    【讨论】:

    • 是一个更好的正则表达式:我在更新的答案中使用的正则表达式(在您的评论之后)是/(\d+)(\D+)(\d+)$/,这意味着“一系列一个或多个数字后跟一系列一个或多个非-digits 后跟一系列一个或多个数字”。
    • Re "不需要月份数组 - 至少不需要英语" 这不是 指定 行为,因此您不应该依赖它(我敢打赌它在非英语本地化浏览器中不起作用)。规范中没有要求Date 构造函数或Date.parse 接受月份名称,无论是英文还是其他形式。一些实现会这样做,但它是依赖于实现的,而不是指定的行为。请参阅the spec 的第 15.9.1.15 节。
    • 请看我的更新。我对这些事情非常务实,并且在编写代码时不阅读 ECMAscript 规范。我更喜欢在现实生活中进行测试:) tools.ietf.org/html/rfc822#section-5
    【解决方案3】:

    这是一个基于 Python 的 time 模块的小型(至少在您取出 cmets 后)utility I wrote - 它采用格式字符串并相应地生成正则表达式以提取日期信息。 unit tests 无需深入了解代码即可了解其功能,但在您的情况下:

    >>> var parts = time.strptime('17Dec2010', '%d%b%Y');
    >>> var date = new Date(parts[0], parts[1]-1, parts[2]);
    Fri Dec 17 2010 00:00:00 GMT+0000 (GMT Standard Time) {}
    

    它还会处理基本验证:

    >>> try
    ... {
    ...     time.strptime('32Dec2010', '%d%b%Y');
    ... }
    ... catch (e)
    ... {
    ...     console.log(e);
    ... }
    Error: Day is out of range: 32
    

    如果您需要,它也可以采用其他方式:

    >>> time.strftime(date, '%d%b%Y');
    "17Dec2010"
    

    【讨论】:

      【解决方案4】:

      Date JS 太棒了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 2013-03-26
        • 2017-01-03
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多