2012-06-28 4 views
9

Ich nehme ein Datum von einem JSON-Objekt im Format 2012-12-31 und versuchen, es in freundliche Werte zu konvertieren und es auszugeben.Javascript Datum Objekt Problem in Safari und IE

var redeemableDate = item.Deal.RedeemableDate; //this is coming in the form of 2012-12-31 
    var redeemableDate = new Date(redeemableDate); 
    var rdDay = weekday[redeemableDate.getDay()]; //using an array with weekdays 
    var rdDate = redeemableDate.getDate(); 
    var rdMonth = monthNames[redeemableDate.getMonth()]; //using an array with month names 
    var rdYear = redeemableDate.getFullYear(); 

    response.write('Valid ' + rdDay + ' ' + rdDate + ' ' + rdMonth + ' ' + rdYear + ' ONLY'); 

Es funktioniert alles finden und gut in Firefox und Chrome, aber Safari und IE (nur auf IE8 getestet bisher) gefällt mir nicht.

In FF und Chrome ich das erwartet:

Gültig Sonntag 2. September 2012 NUR

Aber in Safari und IE, erhalte ich:

Valid undefined NaN undefined NUR

Wenn ich rot warne Nachdem ich es als Date-Objekt eingerichtet habe, gibt Safari 'Invalid Date' zurück und IE gibt 'NaN' zurück. Dies ist offensichtlich, wo das Problem liegt. Gibt es eine Möglichkeit, wie ich meinen Wert in ein Date-Objekt für diese Browser bringen kann?

Antwort

24

Das Datumsformat JJJJ-MM-TT (ISO 8601) wird in Safari und IE nicht unterstützt. Es ist Teil von ECMAscript 5, sollte also nur eine Frage der Zeit sein.

Eine Lösung wäre, das Datum als Argumente an Date zu übergeben.

var date = "2012-12-31".split("-"); 
var your_date = new Date(date[0], date[1]-1, date[2]); 

Beachten Sie, dass Monat Parameter beginnt bei Null (Januar), so dass Sie 1 aus dem Wert aus dem String erhalten abziehen müssen.

EDIT: Für eine Abkürzung siehe Antwort von Joe Larson unten.

+0

einfache und süße Lösung :) –

+10

'var your_date = neues Datum (dateString.split (" - "). Join ("/"));' – jlarson

+0

Guten einen Joe! Ich werde meine Antwort aktualisieren. – jack

6

Du bist besser dran, das Datum durch selbst Parsen:

function dateFromISO(str) { 
    var d = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, y, m, d) { 
    d = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10)); 
    }); 
    return d; 
} 

redeemableDate = dateFromISO(redeemableDate); 

Auch wenn die anderen Browsern diese Datumsstrings gefallen hat, würden Sie das Problem, sie haben immer als UTC interpretiert wird. Wenn ich zum Beispiel den String "2012-12-31" an Firefox übergebe, sagt er mir, dass das Datum der 30. Dezember 2012 ist, weil ich 6 Stunden hinter UTC bin. Mit anderen Worten, "2012-12-31" wird als Mitternacht dieses Datums interpretiert, UTC-Zeit. Angenommen, Sie möchten, dass jeder auf der Welt das richtige Datum sieht. Wenn Sie das Date-Objekt mit Zahlen konstruieren, wird davon ausgegangen, dass es sich um eine lokale Zeit auf dem Client handelt.

1

Ältere Internet Explorer-Versionen (und anscheinend Ihre Safari-Version) werden keine JJJJ-MM-TT-Zeichenfolge analysieren, z. B. new Date('2012-12-31').

Eine andere Option ist jQuery.datepicker.parseDate(), obwohl das ein bisschen übertrieben sein kann.

-1

Im Falle der Verwendung eines PHP-Web-Service, würde ich empfehlen, Ihre Daten unter Verwendung $row['date'] = date('j/n/Y',strtotime($row['date'])); zu normalen Funktionalität mit Safari/ie.

2

Buchsen und joe Larsons Antwort Kombination arbeitete der folgende Code für mich gut:

 $scope.formatDate = function(date){ 
       var date = date.split("-").join("/"); 
       var dateOut = new Date(date); 
       return dateOut; 
     }; 

funktioniert gut für Chrome und Safari ...:)
Danke Jack und Joe Larson !!!

Verwandte Themen