Visualizza la data / ora nel formato locale dell'utente e l'ora


167

Voglio che il server fornisca sempre le date in UTC nell'HTML e che JavaScript sul sito client lo converta nel fuso orario locale dell'utente.

Bonus se posso produrre nel formato data internazionale dell'utente.

Risposte:


165

Sembra che il modo più sicuro per iniziare con una data UTC sia quello di creare un nuovo Dateoggetto e utilizzare i setUTC…metodi per impostarlo sulla data / ora desiderata.

Quindi i vari toLocale…Stringmetodi forniranno un output localizzato.

Esempio:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

Alcuni riferimenti:


1
In Firefox, toLocateDateString()restituisce qualcosa che assomiglia a "Domenica 12 gennaio 2014".
BlueRaja - Danny Pflughoeft

1
Hmm, sì, è un problema piuttosto serio. L'uso di questi metodi non funzionerà se si desidera che la data abbia lo stesso aspetto tra i browser. Qualche alternativa conosciuta?
Josh Mc,

6
Versione a linea singola della suddetta inizializzazione:var d = new Date(Date.UTC(2004,1,29,2,45,26));
m1kael,

4
Potrebbe valere la pena considerare che Chrome (dalla v35) non tiene conto delle impostazioni internazionali dell'utente nelle toLocaleString()funzioni.
Benno,

8
Mi dispiace ma questo metodo non funziona in (Sono in Australia), quando eseguo il codice sopra la data viene visualizzata nel formato USA. Inoltre, MDN afferma che "le impostazioni internazionali utilizzate e la forma della stringa restituita dipendono interamente dall'implementazione".
martedì

65

Per i nuovi progetti, basta usare moment.js

Questa domanda è piuttosto vecchia, quindi moment.js non esisteva in quel momento, ma per i nuovi progetti semplifica moltissimo compiti come questo.

È meglio analizzare la stringa della data da UTC come segue (creare una stringa compatibile ISO-8601 sul server per ottenere risultati coerenti su tutti i browser):

var m = moment("2013-02-08T09:30:26Z");

Ora basta usare mnella tua applicazione, moment.js per impostazione predefinita sul fuso orario locale per le operazioni di visualizzazione. Esistono molti modi per formattare i valori di data e ora o estrarne parti.

Puoi persino formattare un oggetto momento nella locale dell'utente in questo modo:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

Per trasformare un oggetto moment.js in un fuso orario diverso (cioè né quello locale né UTC), avrai bisogno dell'estensione del fuso orario moment.js . Quella pagina ha anche alcuni esempi, è piuttosto semplice da usare.


Come combini tutto questo? m.utcOffset (offset) .format ('LLL') non sembra funzionare.
Bart il

Qualora Luxon o Day.js essere la biblioteca suggerita ora?
Omero,

1
Suggerisco di aggiungereFor old projects, just use jQuery
Xenos,

Non funziona su Chrome - mostra ancora am / pm anche se l'ora è impostata su 24h nelle impostazioni locali del computer
vir us

20

È possibile utilizzare new Date().getTimezoneOffset()/60per il fuso orario. Esiste anche un toLocaleString()metodo per visualizzare una data utilizzando le impostazioni internazionali dell'utente.

Ecco l'intero elenco: lavorare con le date


toLocaleString è estremamente inaffidabile per la presentazione delle date nel formato che un utente potrebbe aspettarsi. Anche se ISO 402 è supportato, è ancora molto inaffidabile e basa il formato su una lingua, non su una lingua.
RobG

@RobG qual è la soluzione anziché toLocaleString?
user924

@ user924 — puoi usare una libreria, ce ne sono molte tra cui scegliere. Il problema con toLocaleString è che implementazioni diverse danno risultati diversi con diversi livelli di supporto per varie lingue e regioni. Ad esempio, la lingua predefinita del mio sistema non è en-US, ma il formato predefinito per toLocaleString per alcuni browser è il formato USA, altri rispettano la mia lingua di sistema. È lo stesso con i nomi di fuso orario, solo peggio perché non sono affatto standardizzati. :-(
RobG

7

Dopo aver costruito l'oggetto data, ecco uno snippet per la conversione:

La funzione accetta un oggetto Date formattato UTC e una stringa di formato.
Avrai bisogno di un Date.strftimeprototipo.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

6
da dove vieni?
Anuj Pandey,

L'impostazione delle ore ha alcun effetto sulle parti Giorno / Data / Anno di un oggetto Data? Non sembra.
ChristoKiwi,

1
@ ChristoKiwi: il valore passato a setHours dovrebbe essere un numero intero getTimezoneOffset()/60può restituire una frazione (ad esempio, l'offset dell'India di +05: 30 restituirà 5,5). I decimali vengono troncati. Altrimenti, l'impostazione delle ore aggiorna altri valori (impostare le ore su 48 e vedere cosa succede).
RobG

7

In JS non ci sono modi semplici e multipiattaforma per formattare l'ora della data locale, al di fuori della conversione di ogni proprietà come menzionato sopra.

Ecco un trucco rapido che utilizzo per ottenere il AAAA-MM-GG locale. Nota che si tratta di un hack, poiché la data finale non avrà più il fuso orario corretto (quindi devi ignorare il fuso orario). Se ho bisogno di altro, utilizzo moment.js.

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

D.getTimezoneOffset () restituisce l'offset del fuso orario in minuti e d.getTime () è in ms, quindi x 60.000.


1
@VG Ho aggiunto alcune informazioni su da dove proviene il 60k. Spero che questo aiuto.
Jeremy Chone,

5

Ecco cosa ho usato nei progetti precedenti:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

4
Questo è con cose specifiche ASP.NET.
ZiggyTheHamster

Gli offset del fuso orario non sono necessariamente multipli di un'ora, quindi getTimezoneOffset()/60spesso restituiscono un valore decimale. Ciò è particolarmente vero per le date precedenti al 1900, dove molti luoghi avevano offset in minuti e secondi. Inoltre, ora sono necessarie le date javascript per supportare gli offset storici. Ad esempio, nel 1890 la compensazione a Mosca era +2: 30: 17. Consulta Browser, fusi orari, errore Chrome 67 .
RobG

3

Il .getTimezoneOffset()metodo riporta l'offset del fuso orario in minuti, contando "verso ovest" dal fuso orario GMT / UTC, ottenendo un valore di offset negativo a quello a cui ci si è abituati comunemente. (Esempio, l'ora di New York sarebbe segnalata in +240 minuti o +4 ore)

Per ottenere un normale fuso orario in ore, è necessario utilizzare:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

Dettaglio importante: si
noti che l'ora legale viene presa in considerazione nel risultato, quindi ciò che questo metodo offre è in realtà la differenza di fuso orario , non la differenza di fuso orario geografico reale .


3

Con la data dal codice PHP ho usato qualcosa del genere ..

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

Possiamo chiamarlo così

var localdateObj = getLocalDate('2015-09-25T02:57:46');

La domanda riguardava JavaScript, non PHP.
pipedreambomb,

5
La risposta è solo in JavaScript, Si dice in questione che la data del server è in UTC. quindi il server potrebbe essere in qualsiasi lingua. quindi ho risposto solo per PHP
hriziya,

3

Mescolo le risposte finora e le aggiungo, perché ho dovuto leggerle tutte e investigare ulteriormente per un po 'per visualizzare una stringa di data e ora da db nel formato di fuso orario locale dell'utente.

La stringa datetime proviene da un db python / django nel formato: 2016-12-05T15: 12: 24.215Z

Il rilevamento affidabile della lingua del browser in JavaScript non sembra funzionare in tutti i browser (vedere JavaScript per rilevare la preferenza della lingua del browser ), quindi ottengo la lingua del browser dal server.

Python / Django: invia la lingua del browser delle richieste come parametro di contesto:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML: scrivilo in un input nascosto:

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript: ottieni il valore di input nascosto, ad es. En-GB, en-US; q = 0.8, en; q = 0.6 / e quindi accetta la prima lingua nell'elenco solo tramite sostituisci ed espressione regolare

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript: converti in datetime e formattalo:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

Vedi: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

Il risultato è (la lingua del browser è en-gb): 05/12/2016, 14:58


3

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);


Per il riferimento: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… (avevo bisogno della optionsparte per il mio caso)
Xenos

2

La migliore soluzione che ho trovato è quella di creare [time display = "llll" datetime = "UTC TIME" /] tag e utilizzare javascript (jquery) per analizzare e visualizzarlo in relazione al tempo dell'utente.

http://momentjs.com/ Moment.js

visualizzerà bene l'ora.


2

È possibile utilizzare quanto segue, che riporta l'offset del fuso orario da GMT in minuti:

new Date().getTimezoneOffset();

Nota: - questa funzione restituisce un numero negativo.


1

getTimeZoneOffset () e toLocaleString sono utili per il lavoro di data di base, ma se hai bisogno del supporto del fuso orario reale, guarda TimeZone.js di mde .

Ci sono alcune altre opzioni discusse nella risposta a questa domanda


1

Per convertire la data in data locale utilizzare il metodo toLocaleDateString ().

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

Per convertire l'ora in ora locale utilizzare il metodo toLocaleTimeString ().

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

-12

Non so come eseguire le impostazioni locali, ma JavaScript è una tecnologia lato client.

usersLocalTime = new Date();

avrà l'ora e la data del cliente al suo interno (come riportato dal proprio browser e per estensione dal computer in cui si trovano). Dovrebbe essere banale includere il tempo del server nella risposta ed eseguire alcuni semplici calcoli per indovinare l'offset temporale.

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.