【问题标题】:Regarding JavaScript new Date() and Date.parse()关于 JavaScript new Date() 和 Date.parse()
【发布时间】:2010-12-01 04:43:59
【问题描述】:
var exampleDate='23-12-2010 23:12:00';  

我想将上面的字符串转换为date 并尝试了几件事:

var date = new Date(exampleDate); //returns invalid Date
var date1 = Date.parse(exampleDate); //returns NAN

此代码在IEOpera 中运行良好,但date 向我返回了无效的Datedate1 在Firefox 中返回NAN。我该怎么办?

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    您示例中的字符串不是浏览器可识别的任何标准格式。 ECMAScript 规范要求浏览器只能解析一种标准格式:

    格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

    此格式包括仅日期格式:

    YYYY

    YYYY-MM

    YYYY-MM-DD

    它还包括带有可选时区偏移量的仅时间形式:

    THH:mm

    THH:mm:ss

    THH:mm:ss.sss

    还包括“日期时间”,可以是上述的任意组合。

    如果字符串不符合该格式,则函数可能会退回到任何 特定于实现的启发式或特定于实现的日期格式。无法识别的字符串或日期 包含 String 格式的非法元素值将导致 Date.parse 返回 NaN。

    因此,在您的示例中,使用 2010-12-23T23:12:00 是唯一保证可以工作的字符串。实际上,大多数浏览器还允许使用DD Month YYYYMonth DD, YYYY 格式的日期,因此23 Dec 2010Dec 23, 2010 之类的字符串也可以使用。

    【讨论】:

    • 在编写此答案时,日期字符串的解析依赖于实现,因此存在 no 字符串“保证工作”。从那时起,没有时区的 ISO 8601 长格式字符串被要求被符合 ES5 的浏览器(如 Firefox)解析为 UTC,被符合 ECMA 2015 的浏览器(如 Chrome 和 Safari)解析为本地。所有 3 种行为都可以在当前使用的浏览器(2015 年)中看到,例如 IE8 返回 NaN,Firefox 40 将其视为 UTC,Chrome 44 将其视为本地。所以仍然有 no 字符串可以“保证工作”。
    【解决方案2】:

    以上格式仅在 IE 和 Chrome 中支持。

    所以尝试其他格式。以下是一些格式和支持的浏览器。

    <script type="text/javascript">
    
    //var dateString = "03/20/2008";  // mm/dd/yyyy [IE, FF]
    
     var dateString = "2008/03/20";  // yyyy/mm/dd [IE, FF]
    // var dateString = "03-20-2008";  // mm-dd-yyyy [IE, Chrome]
    // var dateString = "March 20, 2008";  // mmmm dd, yyyy [IE, FF]
    // var dateString = "Mar 20, 2008";  // mmm dd, yyyy [IE, FF]
    
    // Initalize the Date object by passing the date string variable
    var myDate = new Date(dateString);
    alert(myDate); 
    </script>
    

    【讨论】:

    • 这不应该是公认的答案,请参阅 casablancas 答案
    【解决方案3】:

    您可以使用正则表达式手动解析它,然后使用日期元素调用日期构造函数,如下所示:

    var parseDate = function(s) {
      var re = /^(\d\d)-(\d\d)-(\d{4}) (\d\d):(\d\d):(\d\d)$/;
      var m = re.exec(s);
      return m ? new Date(m[3], m[2]-1, m[1], m[4], m[5], m[6]) : null;
    };
    var dateStr = '23-12-2010 23:12:00';
    parseDate(dateStr).toString(); //=> Thu Dec 23 2010 23:12:00 GMT-0800
    

    【讨论】:

      【解决方案4】:

      JavaScript 至少应支持从以下 dateStrings 进行转换:

      * yyyy/MM/dd
      * MM/dd/yyyy
      * MMMM dd, yyyy
      * MMM dd, yyyy
      

      尝试:

        var exampleDate='12/23/2010 23:12:00';
        var date = new Date(exampleDate); 
      

      【讨论】:

        【解决方案5】:

        使用datejs 和此代码:

        var exampleDate='23-12-2010 23:12:00';
        var myDate = Date.parseExact(exampleDate, 'dd-MM-yyyy hh:mm:ss');
        

        myDate 应该是正确构造的 Date 对象。

        【讨论】:

          【解决方案6】:

          只需以这种格式使用:

          var exampleDate='2010-12-23 23:12:00'; 
          

          【讨论】:

            【解决方案7】:

            @casablanca 有一个很好的答案,但它已经 10 多年了,这在 Google 中仍然很重要,所以我想我会更新一个新的答案。

            TL;DR

            // Use an ISO or Unix time string to generate `Month DD, YYYY` 
            const newDate = new Date('23-12-2010')
            const simpleDate = `${newDate.toLocaleString('en-us', { month: 'long' } )} ${newDate.getDate()}, ${newDate.getFullYear()}`
            // yields: December, 23 2010 (if you want date suffix, read until the end)
            

            背景:日期有多种格式,但您大多会收到:

            • ISO 8601 格式日期 (YYYY-MM-DDTHH:mm:ss.sssZ),其中 Z 是 UTC 时区偏移量。您可能还会得到其中的一个子集(即YYYY-MM-DD
            • Unix 时间戳格式日期 (1539734400),其中数字实际上是自 Unix 时间 1970 年 1 月 1 日开始以来的总毫秒数。

            基础知识: JS 有一个内置的 Date 原型,它接受 ISO 8601 及其衍生版本(只是时间或日期)。您可以使用new Date 实例化并返回一个日期对象,或者您可以使用Date.parse() 方法返回一个Unix 时间戳。

            const dateObj = new Date('23-12-2010:23:12:00') // returns date object
            const dateDateOnly = new Date('23-12-2010') // returns date object
            const dateTimeOnly = new Date('23:12:00') // returns date object
            const dateString = Date.parse('23-12-2010:23:12:00') // returns Unix timestamp string
            

            您还可以将日期分解为 7 个参数:年、月(从 0 开始)、日、小时、分钟、秒和毫秒以及时区偏移量 - 注意,我使用了 multi -params 在我的职业生涯中只使用过一次。由于我在德克萨斯州,所以当我运行以下命令时,我得到了 UTC-5(中部时间):

            const dateByParam = new Date(2021, 2, 26, 13, 50, 13, 30) // Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time)
            

            New-ish Stuff toLocaleString: 通常情况下,Date 对象的返回仍然像我们的上一个示例 (Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time) 一样非常密集,因此添加了其他方法来帮助开发人员.

            通常有一个日期,我想要 March 21st, 2021 之类的东西 - 很长时间以来很容易获得日期和年份:

            // Assuming myDate is a JS Date object...
            myDate.getDate() // date on the calendar, ie 22
            myDate.getDay() // day of the week, where 0 means Sunday, 1 means monday, etc
            myDate.getFullYear() // 4 digit year, ie, 2021
            

            但我一直必须构建一个函数来将getDay 转换为January, February, March,现在不再需要了。 toLocaleString() 给你一些新的超能力。您可以向它传递两个参数,一个区域字符串(即en-us)和一个包含您想要返回的对象(即{ month: 'long' })。如果需要,这有助于使响应国际化。

            // Again, assuming myDate is a JS Date object...
            myDate.toLocaleString('en-us', { month: 'long' } ) // March
            

            日期后缀我仍然没有看到任何内置方法来获取日期的后缀,例如 th, st,所以我构建了这个实用函数,它使用模数 % 运算符来检查每天数字的除数并应用正确的后缀(针对美国观众,但在其他地方可能相同?)。

            /**
             * setDateSuffix()
             * 
             * Desc: Takes two digit date, adds 'st', 'nd', 'rd', etc
             * 
             * @param { integer } num - a number date
             */
            
            export const setDateSuffix = (num) => {
              const j = num % 10,
                    k = num % 100
            
              if (j === 1 && k !== 11) {
                return num + "st";
              }
              if (j === 2 && k !== 12) {
                return num + "nd";
              }
              if (j === 3 && k !== 13) {
                return num + "rd";
              }
            
              return num + "th";
            }
            

            现在一齐.. 到达这里的方式很长,但是如果给我一个 ISO 或 Unix 日期并且我想要Month DDth, YYYY,这就是我运行的:

            // setDateSuffix IS NOT PART OF BUILT-IN JS!
            const newDate = new Date('23-12-2010')
            const simpleDate = `${newDate.toLocaleString('en-us', { month: 'long' } )} ${setDateSuffix(newDate.getDate())}, ${newDate.getFullYear()}`
            // yields: December 23rd, 2010 
            

            注意 - 当temporal 在 JS 中变为现实时,所有这些都可能会改变,希望会变得更好:https://github.com/tc39/proposal-temporal。期待有人在 2030 年更新这篇文章!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多