我有字符串,表示项目的到期时间如下:2020-10-31T21:30:11
,我有一个函数来计算此日期之前剩余的天数(如下)。< / p>
然而,在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);
}
});
答案 0 :(得分:1)
你是对的,IE8不会在开头解析你的约会(timeEnd init)。 原因如下:https://stackoverflow.com/a/17593482/2143734 还有一个日期处理问题;)
答案 1 :(得分:0)
试试这个
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 constructor returns NaN in IE, but works in Firefox and Chrome
答案 2 :(得分:0)
通过查看this Stackoverflow question中的答案,我已经掌握了正在发生的事情并创建了我自己的函数,该函数处理了我想要转换日期对象的字符串。
IE8无法像其他浏览器一样解析字符串2020-10-31T21:30:11
。但是date对象可以接受表示年,月,日等的逗号分隔值,并使用它们来创建新实例(more info about the Date object)。
所以我创建了一个函数,它接受我的字符串,将它吐出“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);
}