Chociaż wartość 2013-05-12 20:00:00
jest jednym kilka ważnych formatów określonych przez ISO8601, najlepiej jest korzystać z profilu zdefiniowanego w RFC3339, który jest podzbiorem ISO8601.
Oznacza to, że powinieneś mieć zarówno separator T
, jak i przesunięcie strefy czasowej - które może być numeryczne lub Z
, aby określić UTC. Innymi słowy, powinieneś użyć wartości takiej jak 2013-05-12T20:00:00-07:00
, lub jej odpowiednika 2013-05-13T03:00:00Z
.
Teraz, czy masz poprawnie sformatowaną wartość wejściową, czy nie, pojawia się problem zgodności przeglądarki. Wszystkie nowoczesne przeglądarki obsługują standard ISO8601, ale niektóre interpretują go inaczej. Na przykład w Google Chrome, jeśli pominiesz T
, zostanie on przeanalizowany jako czas lokalny, nawet jeśli na końcu znajduje się Z
. W przeglądarce Internet Explorer ta sama wartość z pominiętym T
zwraca błąd nieprawidłowej daty.
Lepszym rozwiązaniem jest użycie biblioteki, która usuwa te różnice, dzięki czemu można skupić się na swojej aplikacji, a nie na dziwacznościach przeglądarki. Najlepsza biblioteka, o której mi wiadomo, to moment.js. Oprócz pełnej obsługi dat ISO, możesz analizować dane wejściowe w dowolny sposób za pomocą niestandardowych ciągów formatów. Ma również wiele innych funkcji. Gorąco zachęcam do spojrzenia.
Korzystanie moment.js, można wykonać następujące czynności:
// from a full date-time-offset ISO8601/RFC3339 value
var m = moment('2013-05-12T20:00:00-07:00');
// or from your custom value, with explicit formatting
// this will assume the local time zone because you didn't specify one
var m = moment('2013-05-12 20:00:00','YYYY-MM-DD HH:mm:ss');
// then you can output it in a custom format if you like
m.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, May 12th 2013, 8:00:00 pm"
O ile mi wiadomo, moment.js działa we wszystkich przeglądarkach - w tym starszych jak IE6.
Moment.JS to Awesum –
Zgadzam się, że użycie [moment.js] (http://momentjs.com/) rozwiązuje te problemy. –