new Date () funziona in Chrome ma non in Firefox


89

Sto creando una stringa datetime simile a questa: 2010-07-15 11:54:21

E con il seguente codice ottengo una data non valida in Firefox ma funziona perfettamente in Chrome

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

In firefox date1 mi dà una data non valida, ma in chrome funziona bene quale sarebbe la causa principale?


2
se vuoi giocarci in qualsiasi modo tu voglia, vai con datejs.com
Sinan

Non tutte le implementazioni supportano il formato in ECMA-262, quindi analizza sempre manualmente le stringhe (una libreria può aiutare ma probabilmente non è necessaria per i singoli formati).
RobG

Ora funziona Firefox.
Sm Yamashita

Risposte:


78

Non è possibile creare un'istanza di un oggetto data nel modo desiderato. Deve essere in un modo specifico. Ecco alcuni validi esempi:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

o

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome deve essere solo più flessibile.

Fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Dal commento di apsillers :

la specifica EMCAScript richiede esattamente un formato di data (ad esempio, AAAA-MM-GGTHH: mm: ss.sssZ) ma i formati di data personalizzati possono essere supportati liberamente da un'implementazione : " Se la stringa non è conforme a tale formato [definito da ECMAScript] la funzione può ricorrere a qualsiasi euristica specifica dell'implementazione o formati di data specifici dell'implementazione. "Chrome e FF hanno semplicemente diversi" formati di data specifici dell'implementazione ".


3
Ho una soluzione che funziona in tutti i browser incluso Firefox: stackoverflow.com/a/21984717/586051
Rahul Desai

7
Per quanto riguarda il motivo per cui esiste questa differenza del browser: la specifica EMCAScript richiede esattamente un formato di data (cioè YYYY-MM-DDTHH:mm:ss.sssZ) , ma i formati di data personalizzati possono essere supportati liberamente da un'implementazione : " Se la stringa non è conforme a quel formato [definito da ECMAScript], la funzione può ripiegare su qualsiasi euristica specifica dell'implementazione o formati di data specifici dell'implementazione " . Chrome e FF hanno semplicemente diversi" formati di data specifici dell'implementazione ".
apsillers

Un esempio di un formato di data (mese che include un ".") Che funziona in Chrome ma non in Firefox: "Feb. 14, 2019 '
codescribblr

23

Funziona in tutti i browser -

nuova data ('2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

Formato: AAAA-MM-GGTHH: mm: ss.sss

Dettagli: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


perché sappiamo tutti che è uno standard internazionale. w3.org/International/questions/qa-date-format
Bobby Tables

6
Quindi hai effettivamente testato tutti i browser ? E presumendo che tu l'abbia fatto, sai anche che tutti i browser in futuro supporteranno anche questo formato (non standard)?
RobG

1
Questo funziona per me. Quindi, se ottieni già una stringa di "2001-1-31 12:00:00", possiamo semplicemente fare: new Date (str.replace (/ - / g, '/'));
Jianwu Chen

@JianwuChen Stai deliberatamente modificando un formato standard in non standard. Non è una buona idea.
JJJ

2
Dopo 3 anni dopo, non funziona su Edge e Window Safari.
Mg Thar

13

Opzione 1 :

Supponiamo che la tua stringa temporale abbia un formato simile a questo:

'2016-03-10 16:00:00.0'

In tal caso, potresti eseguire una semplice regex per convertirlo in ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

Questo produrrebbe il seguente output:

'2016-03-10T16:00:00.0'

Questo è il formato datetime standard e quindi supportato da tutti i browser:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

Opzione 2 :

Supponiamo che la tua stringa temporale abbia un formato simile a questo:

'02-24-2015 09:22:21 PM'

Qui puoi eseguire la seguente regex:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

Anche questo produce un formato supportato da tutti i browser:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

Opzione 3:

Supponi di avere una stringa temporale che non è facile da adattare a uno degli standard ben supportati.

In tal caso, è meglio dividere la stringa del tempo in parti diverse e utilizzarle come parametri individuali per Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = new Date ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Questo funziona perfettamente per me in Chrome e in Mozilla.
Rahul Mankar

13

Funziona anche nella maggior parte dei browser

new Date('2001/01/31 12:00:00')

Questo è il formato di

"yyyy/MM/dd HH:mm:ss"

3
Non vi è alcuna garanzia che il formato funzioni con qualsiasi browser, tanto meno "tutti".
RobG

Hai ragione su questo, la risposta si basa sulla mia esperienza.
Alvis

8

Se desideri comunque creare la data utilizzando i trattini, puoi utilizzare questo formato:

var date = new Date('2013-08-31T17:00:00Z')

Ma tieni presente che crea il tempo secondo UTC. Ciò significa che se vivi nel fuso orario GMT + 3 (3 ore prima del GMT), aggiungerà questo offset di fuso orario all'ora. Quindi l'esempio sopra avrà questo valore, se GMT + 3 (nota che sono le 20:00 e non le 17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Assicurati di aggiungere la lettera "Z" alla fine, perché altrimenti Chrome e Firefox analizzeranno la stringa in modo diverso (uno aggiungerà la differenza di orario e l'altro no).


1
Sì, Chrome e Firefox si comportano in modo diverso se non fornisci un fuso orario. E, per interesse, penso che Firefox lo faccia male. Dovrebbe assumere GMT se il fuso orario è assente. Chrome sì, Firefox no. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs

@ JulianJelfs - " Dovrebbe assumere GMT se il fuso orario è assente ", solo per la data (contrariamente a ISO 8601). Per le stringhe di data e ora, dovrebbe assumere locale (coerente con ISO 8601). Ma in ogni caso, l'analisi manuale è l'unico modo sicuro per procedere.
RobG

5

Ho riscontrato un problema simile sia in Firefox che in Safari quando lavoravo con AngularJS. Ad esempio, se una data restituita da Angular era simile a questa:

2014-06-02 10:28:00

usando questo codice:

new Date('2014-06-02 10:28:00').toISOString();

restituisce un errore di data non valida in Firefox e Safari. Tuttavia in Chrome funziona bene. Come ha affermato un'altra risposta, Chrome è molto probabilmente solo più flessibile con l'analisi delle stringhe di data.

Il mio obiettivo finale era formattare la data in un certo modo. Ho trovato un'eccellente libreria che ha gestito sia il problema di compatibilità tra browser che il problema di formattazione della data. La libreria si chiama moment.js .

Utilizzando questa libreria, il codice seguente funziona correttamente su tutti i browser che ho testato:

moment('2014-06-02 10:28:00').format('MMM d YY')

Se desideri includere questa libreria aggiuntiva nella tua app, puoi creare più facilmente la stringa della data evitando possibili problemi di compatibilità del browser. Come bonus avrai un buon modo per formattare, aggiungere, sottrarre, ecc facilmente le date se necessario.


Dovresti sempre passare il formato a moment.js durante l'analisi delle stringhe, altrimenti si limita a indovinare finché non ne trova uno che crea una data valida.
RobG

4

Questo dovrebbe funzionare per te:

var date1 = new Date(year, month, day, hour, minute, seconds);

Ho dovuto creare la data da una stringa, quindi l'ho fatto in questo modo:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

Ricorda che i mesi in javascript vanno da 0 a 11, quindi dovresti ridurre il valore del mese di 1, in questo modo:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

Soluzione semplice, funziona con tutti i browser,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

Una situazione in cui mi sono imbattuto è stata quando ho a che fare con i millisecondi. FF e IE non analizzeranno correttamente questa stringa di data quando tenteranno di creare una nuova data. "2014/11/24 17:38:20.177Z" Non sanno come gestire .177Z. Chrome funzionerà comunque.


0

In effetti, Chrome è più flessibile per gestire diversi formati di stringhe. Anche se non capisci il suo formato String, Chrome può comunque convertire correttamente String in Date senza errori. Come questo:

  var outputDate = new Date(Date.parse(inputString));

Ma per Firefox e Safari, le cose diventano più complesse. Infatti, nel documento di Firefox, si dice già: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

Una stringa che rappresenta una data RFC2822 o ISO 8601 (possono essere utilizzati altri formati, ma i risultati potrebbero essere imprevisti).

Quindi, quando vuoi usare Date.parse in Firefox e Safari, dovresti stare attento. Per me, utilizzo un metodo di trucco per affrontarlo. (Nota: potrebbe non essere sempre corretto per tutti i casi)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

Qui converte prima il 2013-08-08 11:52:18 UTC in 2013-08-08T11: 52: 18Z , quindi il suo formato è le parole adatte nel documento di Firefox. In questo momento, Date.parse sarà sempre corretto in qualsiasi browser.


0

Questo è ciò che ha funzionato per me Firefoxe Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

In bocca al lupo...


-1

In Firefox, qualsiasi data non valida viene restituita come oggetto Date come Date 1899-11-29T19:00:00.000Z, quindi controlla se il browser è Firefox, quindi ottieni l'oggetto Date della stringa "1899-11-29T19:00:00.000Z".getDate(). Infine confrontalo con la data.


Questo non spiega la causa del problema, ma piuttosto quale sarebbe il risultato del problema.
Rytis

-1

Ho usato il seguente formato di data e funziona in tutti i browser.

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.