2013-05-17 8 views
9

jestem Formatowanie daty w następujący sposób:date() powrót Nieprawidłowa data w Safari i Firefox

date = new Date("2013-05-12 20:00:00"); 
formattedDate = new Date(date.getFullYear(),date.getMonth(),date.getDate()); 

Gdy uruchomię to w Chrome to wyjść:

Sun May 12 2013 00:00:00 GMT-0700 (PDT) 

który jest co Potrzebuję, ale gdy uruchomię to w Firefoksie lub Safari, otrzymam

Invalid Date 

Ktoś może zaproponować obejście tego problemu. Dodatkowe punkty, jeśli nie wymagają manipulacji biblioteką, regexem lub stringami.

Odpowiedz

0

Wydaje mi się, że potrzebujesz "T" między datą i godziną, aby uzyskać pełną pracę.

date = new Date("2013-05-12T20:00:00"); 

Istnieje wiele możliwych formatów datetime, które są dozwolone w specyfikacji i nie sądzę, że wszystkie przeglądarki oferują wszystkie możliwości. Dla Firefoksa zobaczyć https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse

być naprawdę bezpieczny cross-browser może chcesz spróbować dokument RFC2822/IETF datę składni (w zasadzie taki sam jak Chrome splunął z powrotem na ciebie)

8

formatu data nie jest standardem dla niektórych przeglądarki. Aby przeanalizować niestandardowe formaty czasu daty, można podzielić je na oddzielne wartości i użyć innego konstruktora Date, który akceptuje year, month, day, hours, minutes, seconds i jest zgodny z przeglądarką. W Twoim przypadku będzie to coś takiego: Przykład

var date = "2013-05-12 20:00:00", 
    values = date.split(/[^0-9]/), 
    year = parseInt(values[0], 10), 
    month = parseInt(values[1], 10) - 1, // Month is zero based, so subtract 1 
    day = parseInt(values[2], 10), 
    hours = parseInt(values[3], 10), 
    minutes = parseInt(values[4], 10), 
    seconds = parseInt(values[5], 10), 
    formattedDate; 

formattedDate = new Date(year, month, day, hours, minutes, seconds); 

Praca tutaj http://jsbin.com/ewozew/1/edit

12

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.

+0

Moment.JS to Awesum –

+0

Zgadzam się, że użycie [moment.js] (http://momentjs.com/) rozwiązuje te problemy. –

0

Dlaczego nie porwać Date z fix-date na początku kodu?

import 'fix-date' // that's ok! 
Powiązane problemy