Come posso usare .toLocaleTimeString () senza visualizzare i secondi?


163

Attualmente sto tentando di visualizzare l'ora dell'utente senza visualizzare i secondi. C'è un modo per farlo usando Javascript .toLocaleTimeString ()?

Fare qualcosa del genere:

var date = new Date();
var string = date.toLocaleTimeString();

visualizzerà l'ora dell'utente con ogni unità, ad es. attualmente mostra 15:39:15. Sono in grado di visualizzare quella stessa stringa, solo senza i secondi? (ad es. 15:39)

Risposte:


317

Puoi sempre impostare le opzioni, in base a questa pagina che puoi impostare, per sbarazzarti dei secondi, qualcosa del genere

var dateWithouthSecond = new Date();
dateWithouthSecond.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});

Supportato da Firefox, Chrome, IE9 + e Opera. Provalo sulla tua console del browser web.


2
Grazie, stavo cercando ore per questa risposta.
MustafaP

5
FYI hour: "2-digit"non funziona per me in Chrome 42 né FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})ritorna "6:15 AM"in entrambi.
user9645,

16
utilizzare []per escludere una locale specifica. In questo modo rimani nelle toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
impostazioni

12
funziona in cromo 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol,

1
Sì, sono passati 4 anni da quando l'ho pubblicato qui, così tante cose sono cambiate. Non c'è da stupirsi che non sia più necessario specificarlo. Saluti
CJLopez,

10

Questo funziona per me:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});

6
Vale la pena notare che, a partire da marzo 2020, l'opzione timeStyle è supportata solo in Chrome e Opera e non in Firefox, Edge / IE e Safari. Se desideri un'ampia copertura, probabilmente è meglio attenersi alle opzioni di ora e minuti per ora.
olivello spinoso

Per Safari / iOS, questo funziona solo negli Stati Uniti dove hai AM / PM. en-US mostrerà 15:16, le altre locali mostreranno 15:16:00.
PassKit

8

Il valore restituito da Date.prototype.toLocaleString dipende dall'implementazione, quindi ottieni quello che ottieni. Puoi provare ad analizzare la stringa per rimuovere i secondi, ma potrebbe essere diversa nei diversi browser, quindi dovrai tenere conto di ogni browser in uso.

Creare il tuo formato non ambiguo non è difficile usando i metodi Date. Per esempio:

function formatTimeHHMMA(d) {
  function z(n){return (n<10?'0':'')+n}
  var h = d.getHours();
  return (h%12 || 12) + ':' + z(d.getMinutes()) + ' ' + (h<12? 'AM' :'PM');
}

7
NON analizzare la stringa restituita da toLocaleTimeString. Sono stato per alcuni anni senza alcun problema. Ma poi oggi ho notato che non funzionava. Si scopre che ci sono caratteri unicode speciali (ad es. 0x200E, un segno da sinistra a destra) che non possono essere elaborati da Date.parse. Non l'ho mai visto arrivare. Quindi smetterò di usare tutte le funzioni locali e costruirò solo le mie stringhe formattate nel tempo. Questo mi salverà da cattive sorprese come questa.
Gabe Halsmer,

@ GabeHalsmer — Non consiglio e non ho mai consigliato di consentire a Date.parse di analizzare le stringhe (ad esempio l'ultimo paragrafo qui ). Ma questo è irrilevante qui, non è affatto menzionato, hai capito male la risposta se pensi che lo faccia (es. " Puoi provare ad analizzare ...").
RobG

Bel link. Quindi, in sintesi, le persone devono effettuare il proprio analisi o il proprio metodo ToString, perché fondamentalmente Date.prototype.toLocalString e Date.parse sono incompatibili. Fare una ToString mi è sembrata la cosa più semplice da fare. Ma hai implementato la tua analisi. Quindi funzionerà anche per le persone. La cosa essenziale di cui volevo rendere tutti consapevoli era che Date.parse non funziona con toLocaleString. E mi ci sono volute ore per rintracciare questa incompatibilità a causa di quanto fosse sottile. I segni da sinistra a destra sono invisibili nel debugger di Visual Studio.
Gabe Halsmer,

Fantastico, un altro voto decisamente fuorviante. Non c'è da stupirsi che le persone non vogliano dare loro il proprio nome.
RobG

Per l'archiviazione e il trasporto di date in altri formati, toISOString e getTime forniscono probabilmente il formato data più sicuro per la reimpostazione. Non sono a conoscenza di alcuna implementazione di JS nell'ultimo decennio che non gestisca la versione in millisecondi di UTC restituita da getTime e che i valori ISO siano stati anche nelle specifiche come formato data analizzabile per un tempo di loooonnng. Ma non rileggere mai le date dagli elementi dell'interfaccia utente. Questo dovrebbe provenire dal tuo livello app. E prova sempre in Safari. Sono stati cretini di livello IE6 sull'oggetto data.
Erik Reppen,

7

Con i locali:

var date = new Date();
date.toLocaleTimeString('fr-FR', {hour: '2-digit', minute: '2-digit'})

0

Ho anche cercato una soluzione a questo problema, ecco cosa mi è venuto in mente:

function getTimeStr() {
    var dt = new Date();
    var d = dt.toLocaleDateString();
    var t = dt.toLocaleTimeString();
    t = t.replace(/\u200E/g, '');
    t = t.replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');
    var result = d + ' ' + t;
    return result;
}

Puoi provarlo qui: http://jsfiddle.net/B5Zrx/

\ u200E è un personaggio di formattazione che ho visto in alcune versioni di IE (è unicode da sinistra a destra).

Suppongo che se il tempo formattato contiene qualcosa come "XX: XX: XX", allora deve essere il tempo con i secondi e rimuovo l'ultima parte, se non trovo questo modello, nulla è cambiato. Abbastanza sicuro, ma c'è il rischio di lasciare secondi in alcune strane circostanze.

Spero solo che non ci siano impostazioni locali che possano modificare l'ordine delle parti temporali formattate (ad es. Renderlo ss: mm: hh). Questo segno da sinistra a destra mi rende un po 'nervoso al riguardo, ecco perché non rimuovo il segno da destra a sinistra (\ u202E) - In questo caso preferisco non trovare una corrispondenza e lasciare il tempo formattato con secondi in tal caso.


1
+1 Sei l' unico a rispondere correttamente alla domanda. Grazie
amico

1
Questo fa molte ipotesi su ciò toLocaleTimeString()che ritorna che potrebbe non essere vero per tutti i locali.
AJ Richardson,

0

Puoi provare questo, che funziona per le mie esigenze.

var d = new Date();
d.toLocaleTimeString().replace(/:\d{2}\s/,' ');

o

d.toLocaleString().replace(/:\d{2}\s/,' ');

6
Questo non funzionerà perché altre lingue potrebbero usare un separatore completamente diverso da :.
Jon Koops,

-2

Ecco una funzione che lo farà, con commenti che spiegano:

  function displayNiceTime(date){
    // getHours returns the hours in local time zone from 0 to 23
    var hours = date.getHours()
    // getMinutes returns the minutes in local time zone from 0 to 59
    var minutes =  date.getMinutes()
    var meridiem = " AM"

    // convert to 12-hour time format
    if (hours > 12) {
      hours = hours - 12
      meridiem = ' PM'
    }
    else if (hours === 0){
      hours = 12
    }

    // minutes should always be two digits long
    if (minutes < 10) {
      minutes = "0" + minutes.toString()
    }
    return hours + ':' + minutes + meridiem
  }

Dal momento che, come altri hanno notato, toLocaleTimeString () può essere implementato in modo diverso nei diversi browser, in questo modo offre un controllo migliore.

Per saperne di più sull'oggetto Date di Javascript, questa è una buona risorsa: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


-2

Penso che alla domanda originale si possa facilmente rispondere con qualcosa che finora è stato trascurato: una semplice suddivisione in stringhe. Il tempo restituito è una stringa di testo, basta dividerlo nel delimitatore ":" e riassemblare la stringa nel modo desiderato. Nessun plug-in, nessun script complicato. e qui vai:

var myVar=setInterval(function(){myTimer()},1000);

function myTimer() {
    var d = new Date();
    currentNow = d.toLocaleTimeString();
    nowArray = currentNow.split(':');
    filteredNow = nowArray[0]+':'+nowArray[1];
    document.getElementById("demo").innerHTML = filteredNow;
}

-3

Anche se questa è una domanda più vecchia, di recente ho avuto lo stesso me stesso, e ho trovato una soluzione più semplice usando espressioni regolari e la funzione di sostituzione della stringa come un'altra alternativa (non sono necessarie librerie js esterne o utilizzo dell'API di internalizzazione ECMAScript) :

var d = new Date();
var localeTime = d.toLocaleTimeString();
var localeTimeSansSeconds = localeTime.replace(/:(\d{2}) (?=[AP]M)/, " ");

Questo approccio utilizza un regex look-ahead per afferrare l'estremità: ss AM / PM della stringa e sostituisce la parte: ss con uno spazio, restituendo il resto della stringa intatta. (Letteralmente dice "Trova i due punti con due cifre e uno spazio seguito da AM o PM e sostituisci i due punti, due cifre e la porzione di spazio con solo uno spazio).

Questa espressione / approccio funziona solo per le versioni locali degli Stati Uniti e degli Stati Uniti. Se anche tu volevi un risultato simile con, diciamo, inglese britannico (en-GB), che non usa AM / PM, è necessaria una diversa espressione regolare.

Sulla base dell'output di esempio dell'interrogatore originale, suppongo che si occupassero principalmente del pubblico americano e dello schema temporale en-US.


-3

Converti semplicemente la data in una stringa, quindi concatena le sottostringhe che desideri.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM

3
Aggiungi una spiegazione al tuo post.
DigitCart

5
toLocaleTimeStringrestituisce una stringa diversa su ogni browser a seconda delle impostazioni locali. Non puoi fare affidamento su queste posizioni, otterrai risultati diversi, probabilmente rotti sul browser di altre persone.
Oriadam,
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.