Comment utiliser .toLocaleTimeString () sans afficher les secondes?

163

J'essaie actuellement d'afficher l'heure de l'utilisateur sans afficher les secondes. Existe-t-il un moyen de le faire en utilisant .toLocaleTimeString () de Javascript?

Faire quelque chose comme ça:

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

affichera l'heure de l'utilisateur avec chaque unité, par exemple, il affiche actuellement 3:39:15 PM. Suis-je capable d'afficher cette même chaîne, juste sans les secondes? (par exemple 15 h 39)

javadog36
la source

Réponses:

317

Vous pouvez toujours définir les options, en fonction de cette page que vous pouvez définir, pour vous débarrasser des secondes, quelque chose comme ça

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

Pris en charge par Firefox, Chrome, IE9 + et Opera. Essayez-le sur la console de votre navigateur Web.

CJLopez
la source
2
Merci, je cherchais cette réponse pendant des heures.
MustafaP
5
FYI hour: "2-digit"ne fonctionne pas pour moi dans Chrome 42 ni FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})retourne "6:15 AM"dans les deux.
user9645
16
utilisez []pour omettre un paramètre régional spécifique. De cette façon, vous restez aux paramètres régionaux des utilisateurs:toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
Hafenkranich
12
fonctionne dans chrome 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol
1
oui, cela fait 4 ans que j'ai posté ceci ici, tellement de choses ont changé. Pas étonnant que vous n'ayez plus besoin de le spécifier. Regards
CJLopez
10

Cela fonctionne pour moi:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});
Floris Looijesteijn
la source
6
Il convient de noter qu'à partir de mars 2020, l'option timeStyle n'est prise en charge que dans Chrome et Opera , et non dans Firefox, Edge / IE et Safari. Si vous voulez une large couverture, il est probablement préférable de vous en tenir aux options des heures et des minutes pour le moment.
nerprun
Pour Safari / iOS, cela ne fonctionne qu'aux États-Unis où vous avez AM / PM. en-US affichera 3:16 PM, les autres paramètres régionaux afficheront 15:16:00.
PassKit
8

La valeur renvoyée par Date.prototype.toLocaleString dépend de l'implémentation, vous obtenez donc ce que vous obtenez. Vous pouvez essayer d'analyser la chaîne pour supprimer les secondes, mais cela peut être différent selon les navigateurs, vous devez donc tenir compte de chaque navigateur utilisé.

Créer votre propre format sans ambiguïté n'est pas difficile avec les méthodes Date. Par exemple:

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');
}
RobG
la source
7
NE PAS analyser la chaîne renvoyée par toLocaleTimeString. J'avais été depuis quelques années sans aucun problème. Mais aujourd'hui, j'ai remarqué que cela ne fonctionnait pas. Il s'avère qu'il existe des caractères Unicode spéciaux (par exemple 0x200E, une marque de gauche à droite) qui ne peuvent pas être traités par Date.parse. Je n'ai jamais vu ça venir. Je vais donc arrêter d'utiliser toutes les fonctions locales, et simplement construire mes propres chaînes au format temporel. Cela me sauvera de mauvaises surprises comme celle-ci.
Gabe Halsmer
@ GabeHalsmer - Je ne recommande pas, et je n'ai jamais recommandé d'autoriser Date.parse à analyser les chaînes (par exemple, le dernier paragraphe ici ). Mais ce n'est pas pertinent ici, ce n'est pas du tout mentionné, vous avez mal compris la réponse si vous pensez que c'est le cas (par exemple « Vous pouvez essayer d'analyser…»).
RobG
Beau lien. Donc, en résumé, les gens doivent soit faire leur propre analyse, soit leur propre méthode ToString, car fondamentalement Date.prototype.toLocalString et Date.parse sont incompatibles. Créer un ToString me semblait être la chose la plus simple à faire. Mais vous avez implémenté votre propre analyse. Donc, l'un ou l'autre fonctionnera pour les gens. La chose essentielle que je voulais faire savoir à tout le monde était que Date.parse ne fonctionne pas avec toLocaleString. Et il m'a fallu des heures pour retracer cette incompatibilité en raison de sa subtilité. Les marques de gauche à droite sont invisibles dans le débogueur de Visual Studio.
Gabe Halsmer
Cool, un autre vote complètement mal orienté. Pas étonnant que les gens ne veuillent pas leur donner leur nom.
RobG
Pour le stockage et le transport des dates vers d'autres formats, toISOString et getTime fournissent probablement le format de date le plus sûr pour l'analyse. Je ne suis au courant d'aucune implémentation JS au cours de la dernière décennie ne gérant pas la version en millisecondes de l'UTC renvoyée par getTime et les valeurs ISO ont également été dans les spécifications en tant que format de date analysable pendant un temps loooonnng. Mais ne relisez jamais les dates des éléments de l'interface utilisateur. Cela devrait provenir de votre couche d'application. Et testez toujours dans Safari. Ce sont des saccades de niveau IE6 à propos de l'objet date.
Erik Reppen
7

Avec les paramètres régionaux:

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

J'ai également cherché une solution à ce problème, voici ce que j'ai finalement trouvé:

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

Vous pouvez l'essayer ici: http://jsfiddle.net/B5Zrx/

\ u200E est un caractère de formatage que j'ai vu sur certaines versions d'IE (c'est une marque Unicode de gauche à droite).

Je suppose que si le temps formaté contient quelque chose comme "XX: XX: XX" alors il doit être temps avec secondes et je supprime la dernière partie, si je ne trouve pas ce modèle, rien n'est changé. Assez sûr, mais il y a un risque de laisser des secondes dans certaines circonstances étranges.

J'espère juste qu'il n'y a pas de locale qui changerait l'ordre des parties de temps formatées (par exemple, faites-le ss: mm: hh). Cette marque de gauche à droite me rend un peu nerveux à ce sujet, c'est pourquoi je ne supprime pas la marque de droite à gauche (\ u202E) - je préfère ne pas trouver de correspondance dans ce cas et laisser le heure formatée en secondes dans ce cas.

ag.
la source
1
+1 Vous êtes le seul à avoir répondu correctement à la question. Thanks mate
mate64
1
Cela fait beaucoup d'hypothèses sur les toLocaleTimeString()retours qui peuvent ne pas être vraies pour tous les paramètres régionaux.
AJ Richardson
0

Vous pouvez essayer ceci, qui répond à mes besoins.

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

ou

d.toLocaleString().replace(/:\d{2}\s/,' ');
karma
la source
6
Cela ne fonctionnera pas car d'autres langues peuvent utiliser un séparateur entièrement différent de :.
Jon Koops
-2

Voici une fonction qui le fera, avec des commentaires qui expliquent:

  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
  }

Puisque, comme d'autres l'ont noté, toLocaleTimeString () peut être implémenté différemment dans différents navigateurs, cette manière donne un meilleur contrôle.

Pour en savoir plus sur l'objet Javascript Date, voici une bonne ressource: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Koanima
la source
-2

Je pense que la question originale peut facilement trouver une réponse avec quelque chose qui a été négligé jusqu'à présent: une simple fente de chaîne. L'heure renvoyée est une chaîne de texte, il suffit de la diviser sur le délimiteur ":" et de remonter la chaîne comme vous le souhaitez. Pas de plug-ins, pas de script compliqué. et voilà:

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;
}
Frank Eastes
la source
-3

Même s'il s'agit d'une question plus ancienne, j'ai eu la même question récemment et j'ai proposé une solution plus simple utilisant des expressions régulières et la fonction de remplacement de chaîne comme autre alternative (pas besoin de bibliothèques js externes ou de dépendance à l'API d'internalisation ECMAScript) :

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

Cette approche utilise un look-ahead regex pour saisir la fin: ss AM / PM de la chaîne et remplace la partie: ss par un espace, renvoyant le reste de la chaîne intact. (Dit littéralement "Trouvez un deux-points avec deux chiffres et un espace qui est suivi par AM ou PM et remplacez les deux points, deux chiffres et la partie d'espace par juste un espace).

Cette expression / approche ne fonctionne que pour les paramètres régionaux en-US et en-US-like. Si vous vouliez également un résultat similaire avec, par exemple, l'anglais britannique (en-GB), qui n'utilise pas AM / PM, une expression régulière différente est nécessaire.

Sur la base de l'échantillon de sortie de l'interrogateur original, je suppose qu'ils traitaient principalement du public américain et du schéma temporel en-US.

Émeu
la source
-3

Convertissez simplement la date en chaîne, puis concaténez les sous-chaînes que vous souhaitez en extraire.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM
Bradley
la source
3
Veuillez ajouter quelques explications à votre message.
DigitCart
5
toLocaleTimeStringrenvoie une chaîne différente sur chaque navigateur en fonction des paramètres régionaux. Vous ne pouvez pas vous fier à ces positions, vous obtiendrez des résultats différents, probablement cassés, sur les navigateurs d'autres personnes.
oriadam