37

My code is working properly in Google Chrome, but not in Safari.

I figured out that I need to convert yyyy-MM-dd HH:mm:ss to ISO 8601, but I didn't found a solution to do this.


Online Test Link: http://jsfiddle.net/UVgHR/


Javascript:

$(document).ready(function() {

    calculateMinutes();
    setInterval(calculateMinutes, 60000);

});

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var diff = Math.abs(new Date( $(this).data('timestamp') ) - new Date());
        var minutes = Math.floor((diff/1000)/60);
        $(this).html( minutes + ' min.' );
    });
}

HTML Example:

<span class="calculateMinutes" data-timestamp="2014-02-18 15:00:48">
Luciano Nascimento
  • 2,600
  • 2
  • 44
  • 80

6 Answers6

100

To make your question easier your problem is with:

new Date('2014-02-18 15:00:48')

This work okay in chrome but not in safari. The mdn talks about ECMAScript 5 ISO-8601 format support says:

Alternatively, the date/time string may be in ISO 8601 format. For example, "2011-10-10" (just date) or "2011-10-10T14:48:00" (date and time) can be passed and parsed.

If you include T it works:

new Date('2014-02-18T15:00:48')

You can use new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')).

If you handle a lot of cases like this I will recommend using moment which seems to handle this case very well with or without T: parsing from string. Additionally your whole example is easier with momentjs:

var minutes = moment().diff("2014-02-18 15:00:48", 'minutes');
José F. Romaniello
  • 13,866
  • 3
  • 36
  • 38
13

I think Jose missed one point here - Do not forget to include Z or else there will be lag of the timezone.

new Date('2014-02-18T15:00:48') new Date('2014-02-18T15:00:48Z')

You can use new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')+'Z').

Refer this for more info - new Date() works differently in Chrome and Firefox

Abhishek Jain
  • 176
  • 1
  • 8
  • Please comment on Jose's answer, in stead of a new answer. – vinS Dec 13 '17 at 10:32
  • 10
    I can't comment unless it's my own answer. Says - "You must have 50 reputation to comment" :( – Abhishek Jain Dec 24 '17 at 03:49
  • Noticed this issue in iOS and ended up here looking for the solution. Worked well for my needs (handled string replacement in PHP on a MySQL datetime value). Upvoting this answer since @AbhishekJain doesn't have the rep to comment, and upvoting José's answer as well ;) – Mavelo Jul 30 '21 at 01:28
  • This solution adds 5 hours in the date. Which is wrong implementation – Ali Wahab Jul 28 '22 at 07:57
5

I've seen an issue like this before and what works for me is to replace the space between the Date and the Time with a T. Try this:

Updated JavaScript:

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var timestamp = $(this).data('timestamp').replace(' ', 'T');
        var diff = Math.abs(new Date(timestamp) - new Date());
        var minutes = Math.floor((diff / 1000) / 60);
        $(this).html(minutes + ' min.');
    });
}

JSFiddle here.

Jamie Dunstan
  • 3,725
  • 2
  • 24
  • 38
1

Change this piece of code

new Date('2014-02-18 15:00:48')

To

new Date('2014-02-18 15:00:48'.replace(" ", "T"))
Ali Wahab
  • 482
  • 6
  • 13
0

It works in Safari if you replace the dashes with slashes:

dateTimeString.replace(/-/g, '/')

Neets
  • 4,094
  • 10
  • 34
  • 46
0

Just replacing "-" to "/" may works.

TO

var myTime = new Date('03/09/2022 00:00:00');
Kasım Onuk
  • 324
  • 3
  • 6