I can’t understand why this script works only on Chrome and Firefox on Desktop, and not works on Safari Desktop and any mobile browser.
<span style="font-size:1.4rem;margin:0 .5rem;"><span id="days"></span> Days</span> <span style="font-size:1.4rem;margin:0 .5rem;"><span id="hours"></span> Hours</span> <span style="font-size:1.4rem;margin:0 .5rem;"><span id="minutes"></span> Minutes</span> <span style="font-size:1.4rem;margin:0 .5rem;"><span id="seconds"></span> Seconds</span> <script type="text/javascript"> var second = 1000; var minute = second * 60; var hour = minute * 60; var day = hour * 24; var countDown = new Date('Apr 20, 2021 24:00:00').getTime(); var x = setInterval(function () { var now = new Date().getTime(); var distance = countDown - now; document.getElementById('days').innerText = Math.floor(distance / day), document.getElementById('hours').innerText = Math.floor(distance % day / hour), document.getElementById('minutes').innerText = Math.floor(distance % hour / minute), document.getElementById('seconds').innerText = Math.floor(distance % minute / second); }, second); </script>
I’ve checked all the incompatibilities but I don’t seem to see any.
Returned to me alloways NaN
even if I use Number(...)
I just can’t understand.
Advertisement
Answer
Safari is a lot more strict on date formats.
I would suggest changing the format of your data string or manipulating it with Regex and so forth but it all gets a bit messy. One is assuming all your date data is going to be consistent?!
Example: https://codepen.io/alexpetergill/pen/39b775983b851e8fa14f1e548252d810
Just tested this on Big Sur / Safari 14
var months = { 'Jan' : '01', 'Feb' : '02', 'Mar' : '03', 'Apr' : '04', 'May' : '05', 'Jun' : '06', 'Jul' : '07', 'Aug' : '08', 'Sep' : '09', 'Oct' : '10', 'Nov' : '11', 'Dec' : '12' } function parseDate(s) { var dateTime = s.split(' '); var time = dateTime.pop(); var day = dateTime[1].replace(/[, ]+/g, ' ').trim(); var month = months[dateTime[0]]; var year = dateTime[2]; var date = new Date(year + '-' + month + '-' + day).toISOString().split('T')[0] return Date.parse(date + 'T' + time) // 2021-04-20T24:00:00 } var countDown = parseDate('Apr 20, 2021 24:00:00');
The output of parseDate()
is loosely based on the ECMAScript specification https://262.ecma-international.org/11.0/#sec-date-time-string-format
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 calendar date extended format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ