日期构造函数在 IE 中返回 NaN,但在 Firefox 和 Chrome 中有效

IT技术 javascript internet-explorer date
2021-01-28 00:25:38

我正在尝试用 JavaScript 构建一个小日历。我的日期在 Firefox 和 Chrome 中运行良好,但在 IE 中,日期函数返回 NaN。

这是功能:

function buildWeek(dateText){
    var headerDates='';
    var newDate = new Date(dateText);

    for(var d=0;d<7;d++){
        headerDates += '<th>' + newDate + '</th>';
        newDate.setDate(newDate.getDate()+1);
    }                       

    jQuery('div#headerDates').html('<table><tr>'+headerDates+'</tr></table>');
}

dateText是当前周的星期一,它实际上是在php中以'm, d, Y'的格式设置的,例如"02, 01, 2010"

6个回答

从 mysql 日期时间/时间戳格式:

var dateStr="2011-08-03 09:15:11"; //returned from mysql timestamp/datetime field
var a=dateStr.split(" ");
var d=a[0].split("-");
var t=a[1].split(":");
var date = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]);

我希望对某人有用。适用于 IE FF Chrome

const a = dateStr.split(' '); const d = a[0].split('-'); const t = a[1].split(':'); currentValue.created_date = new Date(+d[0], (+d[1] - 1), +d[2], +t[0], +t[1]); ES5 或更高版本。
2021-03-21 00:25:38
适用于所有浏览器。谢谢
2021-04-01 00:25:38

Date 构造函数接受任何值。如果参数的原始 [[value]] 是数字,则创建的日期具有该值。如果原始 [[value]] 是 String,则规范仅保证 Date 构造函数和 parse 方法能够解析 Date.prototype.toString 和 Date.prototype.toUTCString() 的结果

设置 Date 的一种可靠方法是构造一个并使用setFullYearsetTime方法。

一个例子出现在这里:http : //jibbering.com/faq/#parseDate

ECMA-262 r3 没有定义任何日期格式。将字符串值传递给 Date 构造函数或 Date.parse 具有依赖于实现的结果。最好避免。


编辑: comp.lang.javascript FAQ 中的条目是:可以将扩展的 ISO 8601 本地日期格式YYYY-MM-DD解析为Date以下内容:-

/**Parses string formatted as YYYY-MM-DD to a Date object.
 * If the supplied string does not match the format, an 
 * invalid Date (value NaN) is returned.
 * @param {string} dateStringInRange format YYYY-MM-DD, with year in
 * range of 0000-9999, inclusive.
 * @return {Date} Date object representing the string.
 */

  function parseISO8601(dateStringInRange) {
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) {
      month = +parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth() + 1) {
        date.setTime(NaN);
      }
    }
    return date;
  }
我一直在使用从该代码派生的函数来解析字符串中的 ISO 日期/时间。在极少数情况下,我会在if (month != date.getMonth() + 1)语句中输入一个看似有效的值,从而使日期无效。例如,2014-06-01T01:09:22.68你能解释一下这个if声明的目的吗?
2021-03-12 00:25:38
唉,这不好,因为许多结构化格式只使用 W3C 日期/时间格式(具有完整规范的 ISO-8601 左右)。因此,虽然时间戳在很多方面都更好(更简单、更高效、适用于所有浏览器),但通常需要标准日期/时间数据是来自 javascript 的解析器。我想知道 jQuery 之类的是否会有更好的解析方法。
2021-03-13 00:25:38
如果你也想要毫秒怎么办?
2021-03-13 00:25:38
谢谢加勒特。您在链接中提供的那个功能是最好的,比我能找到的任何其他功能都要简洁得多,并且它适用于我在应用程序的其他 99% 中使用的日期格式!比我使用的更一致。
2021-03-16 00:25:38
感谢您指出,为什么 chrome 可以很好地解析日期而 ie7 说 NAN,那么好东西 $.datepicker.parseDate 来自 jquery 能够解析日期
2021-04-06 00:25:38

不要使用“new Date()”,因为它将输入日期字符串作为本地时间:

new Date('11/08/2010').getTime()-new Date('11/07/2010').getTime();  //90000000
new Date('11/07/2010').getTime()-new Date('11/06/2010').getTime();  //86400000

我们应该使用“NewDate()”,它将输入作为 GMT 时间:

function NewDate(str)
         {str=str.split('-');
          var date=new Date();
          date.setUTCFullYear(str[0], str[1]-1, str[2]);
          date.setUTCHours(0, 0, 0, 0);
          return date;
         }
NewDate('2010-11-07').toGMTString();
NewDate('2010-11-08').toGMTString();

这是向Date对象添加方法的另一种方法

用法: var d = (new Date()).parseISO8601("1971-12-15");

    /**
     * 将 ISO 8601 格式的日期解析为日期对象,ISO 8601 为 YYYY-MM-DD
     * 
     * @param {String} 将日期作为字符串,例如 1971-12-15
     * @returns {Date} 表示所提供字符串日期的日期对象
     */
    Date.prototype.parseISO8601 = 函数(日期){
        var 匹配 = date.match(/^\s*(\d{4})-(\d{2})-(\d{2})\s*$/);

        如果(匹配){
            this.setFullYear(parseInt(matches[1]));    
            this.setMonth(parseInt(matches[2]) - 1);    
            this.setDate(parseInt(matches[3]));    
        }

        返回这个;
    };

我总是以 UTC 时间存储我的日期。

这是我自己的函数,由我在此页面中找到的不同函数组成。

它采用 STRING 作为 mysql DATETIME 格式(例如:2013-06-15 15:21:41)。使用正则表达式进行检查是可选的。您可以删除此部分以提高性能。

此函数返回一个时间戳。

DATETIME 被视为 UTC 日期注意:如果您期望本地日期时间,则此功能不适合您。

    function datetimeToTimestamp(datetime)
    {
        var regDatetime = /^[0-9]{4}-(?:[0]?[0-9]{1}|10|11|12)-(?:[012]?[0-9]{1}|30|31)(?: (?:[01]?[0-9]{1}|20|21|22|23)(?::[0-5]?[0-9]{1})?(?::[0-5]?[0-9]{1})?)?$/;
        if(regDatetime.test(datetime) === false)
            throw("Wrong format for the param. `Y-m-d H:i:s` expected.");

        var a=datetime.split(" ");
        var d=a[0].split("-");
        var t=a[1].split(":");

        var date = new Date();
        date.setUTCFullYear(d[0],(d[1]-1),d[2]);
        date.setUTCHours(t[0],t[1],t[2], 0);

        return date.getTime();
    }