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

Date object returns NaN when trying to calculate time between two dates in IE8

本文关键字:之间 日期 两个 时间 NaN 返回 对象 计算 IE8 Date      更新时间:2023-09-26

我有一个字符串,它表示一个项目的到期时间,如下所示:2020-10-31T21:30:11,我有一个函数来计算距离该日期还剩的天数(如下)。

但是,在IE8中它不起作用。我认为这是因为timeEnd正在返回NaN.有人可以解释为什么这不起作用并指出我正确的方向吗?

我这里有一个jsFiddle。

这是我的代码片段:

.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);
    }
});
你是

对的,IE8不会在开始时解析你的日期(timeEnd init)。原因如下: https://stackoverflow.com/a/17593482/2143734还有一个日期处理问题;)

试试这个

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;
  }

进行转换。

来源:Date 构造函数在 IE 中返回 NaN,但在 Firefox 和 Chrome 中工作

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

IE8 不能像其他浏览器那样2020-10-31T21:30:11解析字符串。但是 date 对象可以接受表示年、月、日等的逗号分隔值,并使用它们创建新实例(有关 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);
}