Javascript Date对象在IE8中尝试计算两个日期之间的时间时返回NaN

Javascript Date对象在IE8中尝试计算两个日期之间的时间时返回NaN,javascript,jquery,html,datetime,internet-explorer-8,Javascript,Jquery,Html,Datetime,Internet Explorer 8,我有一个字符串,它表示这样一个项目的到期日期:2020-10-31T21:30:11,我有一个函数来计算截至该日期的剩余天数(如下) 然而,在IE8中它不起作用。我想这是因为timeEnd正在返回NaN。有人能解释一下为什么这不起作用并给我指出正确的方向吗 我有一本书 下面是我的一段代码: HTML <span class="days-left" data-publishend="2020-10-31T21:30:11"></span> JS $('.days-le

我有一个字符串,它表示这样一个项目的到期日期:
2020-10-31T21:30:11
,我有一个函数来计算截至该日期的剩余天数(如下)

然而,在IE8中它不起作用。我想这是因为
timeEnd
正在返回
NaN
。有人能解释一下为什么这不起作用并给我指出正确的方向吗

我有一本书

下面是我的一段代码:

HTML

<span class="days-left" data-publishend="2020-10-31T21:30:11"></span>

JS

$('.days-left').each(function () {

    if ($(this).data("publishend")) {
        var timeEnd = new Date($(this).data("publishend")), // returns NaN in IE8
            timeNow = new Date(),
            oneDay = 24*60*60*1000,
            oneHour = 60*60*1000,
            oneMin = 60*1000,
            daysLeft = Math.floor(Math.abs(timeEnd.getTime() - timeNow.getTime())  / oneDay),
            hoursLeft = Math.floor(Math.abs(timeEnd.getTime() - timeNow.getTime())  / oneHour),
            minsLeft = Math.floor(Math.abs(timeEnd.getTime() - timeNow.getTime())  / oneMin),
            string;

        if (daysLeft < 1) {
            if (hoursLeft < 1.5) {
                string = minsLeft + ' minutes';
            } else {
                string = hoursLeft + ' hours left';
            }
        }
        if (daysLeft === 1) string = '1 day left';
        if (daysLeft > 1) string = daysLeft + ' days left';

        $(this).text(string);
    }
});
$('.days left')。每个(函数(){
if($(this).data(“publishend”)){
var timeEnd=new Date($(this).data(“publishend”),//在IE8中返回NaN
timeNow=新日期(),
一天=24*60*60*1000,
一小时=60*60*1000,
一分钟=60*1000,
daysLeft=Math.floor(Math.abs(timeEnd.getTime()-timeNow.getTime())/oneDay),
hourslight=Math.floor(Math.abs(timeEnd.getTime()-timeNow.getTime())/oneHour),
minsleet=Math.floor(Math.abs(timeEnd.getTime()-timeNow.getTime())/oneMin),
一串
如果(daysLeft<1){
如果(左小时<1.5){
字符串=分钟左+分钟;
}否则{
字符串=hoursleet+“hoursleet”;
}
}
if(daysLeft==1)string='1 day left';
如果(daysLeft>1)字符串=daysLeft+“剩余天数”;
$(this).text(字符串);
}
});
试试这个

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;
  }
进行转换


来源:

你是对的,IE8不会从一开始就解析你的日期(timeEnd init)。 原因如下:
只需再处理一个日期问题;)

通过查看中的答案,我已经掌握了正在发生的事情,并创建了自己的函数来处理我想要转换日期对象的字符串

IE8无法像其他浏览器一样解析字符串
2020-10-31T21:30:11
。但是date对象可以接受逗号分隔的值,这些值表示年、月、日等,并使用它们来创建新实例()

因此,我创建了一个函数,它接受我的字符串,将其吐在“T”处,然后在“-”或“:”处拆分剩余的值。然后,该函数使用这些值作为参数返回日期对象实例

function parseDateString(dateString) {
    var a = dateString.split('T'),
        year = a[0].split('-')[0],
        month = a[0].split('-')[1],
        day = a[0].split('-')[2],
        hour = a[1].split(':')[0],
        min = a[1].split(':')[1];

    return new Date(year, month - 1, day, hour, min);
}

IE8不知道如何解析这个日期字符串。