2013-05-17 13 views
9

sto Formattare una data nel seguente modo:data() ritorno data non valida in Safari e Firefox

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

Quando ho eseguito questo in Chrome emette:

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

Che è ciò che ho bisogno, tuttavia quando ho eseguito questo in Firefox o Safari ottengo

Invalid Date 

può qualunque suggerire una soluzione per questo. Punti extra se non richiede una libreria, regex o manipolazione di stringhe.

risposta

0

Penso che sia necessaria una "T" tra la data e l'ora per farlo funzionare completamente.

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

ci sono un bel paio di formati datetime possibili consentiti nelle specifiche e non credo che tutti i browser offrono tutte le possibilità. Per Firefox vedere https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse

per essere davvero sicuri cross-browser che si potrebbe desiderare di provare la sintassi RFC2822/data IETF (fondamentalmente lo stesso come Chrome sputato di nuovo fuori a voi)

8

il formato data non è standard per un po ' i browser. Per analizzare i formati di data e ora personalizzati puoi dividerli in valori separati e utilizzare un altro costruttore Date che accetta year, month, day, hours, minutes, seconds ed è compatibile con più browser. Per il vostro caso sarà qualcosa di simile a questo: ad esempio

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); 

Lavorare qui http://jsbin.com/ewozew/1/edit

12

Mentre il valore 2013-05-12 20:00:00 è uno diversi formati validi specificati dal ISO8601, è meglio utilizzare il profilo definito in RFC3339, che è un sottoinsieme di ISO8601.

Ciò significa che è necessario disporre sia del separatore T sia di un offset del fuso orario, che può essere numerico o Z per specificare UTC. In altre parole, è necessario utilizzare un valore come 2013-05-12T20:00:00-07:00 o l'equivalente 2013-05-13T03:00:00Z.

Ora che si disponga o meno di un valore di input formattato correttamente, viene visualizzato il problema della compatibilità del browser. Tutti i browser moderni supportano ISO8601, ma alcuni lo interpretano in modo diverso. Ad esempio, in Google Chrome, se ometti lo T, viene analizzato come ora locale anche se alla fine c'è un Z. In Internet Explorer, lo stesso valore con omissione di T restituisce un errore di data non valido.

Un approccio migliore consiste nell'utilizzare una libreria che astrae queste differenze, in modo che sia possibile concentrarsi sull'applicazione e non sulle stranezze del browser. La migliore libreria che conosco per questo è moment.js. Oltre al pieno supporto per le date ISO, è possibile analizzare l'input in qualsiasi modo desiderato con stringhe di formato personalizzate. Ha anche molte altre caratteristiche. Ti incoraggio molto a dare un'occhiata.

Utilizzando moment.js, è possibile effettuare le seguenti operazioni:

// 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" 

Per quanto ne so, moment.js opere in tutti i browser - inclusi quelli più vecchi come IE6.

+0

Moment.JS è Awesum –

+0

sono d'accordo [moment.js] (http://momentjs.com/) gli indirizzi di utilizzo di questi problemi. –

0

Perché non dirottare Date con fix-date all'inizio del codice?

import 'fix-date' // that's ok! 
Problemi correlati