Jak używać .toLocaleTimeString () bez wyświetlania sekund?

162

Obecnie próbuję wyświetlić czas użytkownika bez wyświetlania sekund. Czy istnieje sposób, aby to zrobić za pomocą .toLocaleTimeString () JavaScript?

Robię coś takiego:

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

wyświetli czas użytkownika z każdą jednostką, np. obecnie wyświetla 3:39:15 PM. Czy mogę wyświetlić ten sam ciąg, bez sekund? (np. 15:39)

javadog36
źródło

Odpowiedzi:

316

Zawsze możesz ustawić opcje, na podstawie tej strony, którą możesz ustawić, aby pozbyć się sekund, coś takiego

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

Obsługiwane przez Firefox, Chrome, IE9 + i Opera. Wypróbuj na konsoli przeglądarki internetowej.

CJLopez
źródło
2
Dzięki, godzinami szukałem tej odpowiedzi.
MustafaP,
5
FYI hour: "2-digit"nie działa dla mnie w Chrome 42 ani FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})wraca "6:15 AM"w obu.
user9645
16
użyj, []aby pominąć określone ustawienie regionalne. W ten sposób pozostaniesz przy lokalizacji użytkowników:toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
Hafenkranich
12
działa w chrome 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol
1
tak, minęły 4 lata odkąd to tutaj opublikowałem, więc wiele rzeczy się zmieniło. Nic dziwnego, że nie musisz już tego określać. Pozdrawiam
CJLopez
10

To działa dla mnie:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});
Floris Looijesteijn
źródło
6
Warto zauważyć, że od marca 2020 r . Opcja timeStyle jest obsługiwana tylko w przeglądarce Chrome i Opera , a nie w przeglądarkach Firefox, Edge / IE i Safari. Jeśli chcesz mieć szeroki zasięg, prawdopodobnie na razie lepiej trzymać się opcji godzin i minut.
rokitnik
W przypadku Safari / iOS działa to tylko w Stanach Zjednoczonych, gdzie masz AM / PM. en-US wyświetli 15:16, inne ustawienia narodowe - 15:16:00.
PassKit
8

Wartość zwracana przez Date.prototype.toLocaleString jest zależna od implementacji, więc otrzymujesz to, co otrzymujesz. Możesz spróbować przeanalizować ciąg, aby usunąć sekundy, ale może on być inny w różnych przeglądarkach, więc musisz uwzględnić każdą używaną przeglądarkę.

Tworzenie własnego, jednoznacznego formatu przy użyciu metod Date nie jest trudne. Na przykład:

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
źródło
7
NIE analizuj ciągu zwróconego z toLocaleTimeString. Przez kilka lat byłem bez problemu. Ale dzisiaj zauważyłem, że nie działa. Okazuje się, że istnieją specjalne znaki Unicode (np. 0x200E, znak od lewej do prawej), których Date.parse nie może przetworzyć. Nigdy tego nie widziałem. Więc zamierzam przestać używać wszystkich funkcji regionalnych i po prostu skonstruować własne ciągi sformatowane według czasu. To uchroni mnie przed złymi niespodziankami, takimi jak ta.
Gabe Halsmer
@ GabeHalsmer - nie zalecam i nigdy nie polecałem zezwalania Date.parse na analizowanie ciągów (np. Ostatni akapit tutaj ). Ale to nie ma tu znaczenia, w ogóle o tym nie wspominano, jeśli uważasz, że nie zrozumiałeś odpowiedzi (np. „ Możesz spróbować przeanalizować…”).
RobG
Niezły link. Podsumowując, ludzie muszą albo utworzyć własną analizę parsowania, albo własną metodę ToString, ponieważ zasadniczo Date.prototype.toLocalString i Date.parse są niekompatybilne. Tworzenie ToString wydawało mi się najłatwiejszą rzeczą do zrobienia. Ale zaimplementowałeś własną parsę. Więc albo będzie działać dla ludzi. Najważniejszą rzeczą, o której chciałem wszystkich wiedzieć, było to, że Date.parse nie działa z toLocaleString. Zrozumienie tej niezgodności zajęło mi wiele godzin, ponieważ była ona subtelna. Znaki od lewej do prawej są niewidoczne w debugerze programu Visual Studio.
Gabe Halsmer
Fajnie, kolejne całkowicie błędne głosowanie. Nic dziwnego, że ludzie nie chcą podawać im swoich nazwisk.
RobG,
Do przechowywania i transportu dat do innych formatów, toISOString i getTime prawdopodobnie zapewniają najbezpieczniejszy format daty do ponownej analizy. Nie znam żadnej implementacji JS w ostatniej dekadzie, która nie obsługiwałaby milisekundowej wersji UTC zwróconej z getTime i wartości ISO były również w specyfikacjach jako parsowalny format daty przez długi czas. Ale nigdy nie czytaj dat z elementów interfejsu użytkownika. Powinien pochodzić z warstwy aplikacji. I zawsze testuj w Safari. Byli szarpnięciami na poziomie IE6 na temat obiektu daty.
Erik Reppen
7

Z lokalizacjami:

var date = new Date();
date.toLocaleTimeString('fr-FR', {hour: '2-digit', minute: '2-digit'})
Mickael Austoni
źródło
0

Szukałem też rozwiązania tego problemu, oto co ostatecznie wymyśliłem:

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

Możesz spróbować tutaj: http://jsfiddle.net/B5Zrx/

\ u200E to jakiś znak formatujący, który widziałem w niektórych wersjach IE (jest to znak Unicode od lewej do prawej).

Zakładam, że jeśli sformatowany czas zawiera coś w rodzaju „XX: XX: XX” to musi to być czas z sekundami i usuwam ostatnią część, jeśli nie znajdę tego wzorca, nic się nie zmienia. Całkiem bezpieczne, ale istnieje ryzyko, że w dziwnych okolicznościach zostawisz kilka sekund.

Mam tylko nadzieję, że nie ma ustawień regionalnych, które zmieniłyby kolejność sformatowanych części czasu (np. Sprawiły, że ss: mm: hh). Ten znak od lewej do prawej trochę mnie denerwuje, dlatego nie usuwam znaku od prawej do lewej (\ u202E) - wolę w tym przypadku nie szukać dopasowania i zostawić w takim przypadku czas sformatowany w sekundach.

ag.
źródło
1
+1 Jako jedyny odpowiedziałeś poprawnie na pytanie. Dzięki kolego
mate64
1
To czyni wiele założeń dotyczących toLocaleTimeString()zwrotów, które mogą nie być prawdziwe dla wszystkich ustawień regionalnych.
AJ Richardson
0

Możesz spróbować tego, co działa na moje potrzeby.

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

lub

d.toLocaleString().replace(/:\d{2}\s/,' ');
karma
źródło
6
To nie zadziała, ponieważ inne języki mogą używać zupełnie innego separatora niż :.
Jon Koops,
-2

Oto funkcja, która to zrobi, z komentarzami, które wyjaśniają:

  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
  }

Ponieważ, jak zauważyli inni, toLocaleTimeString () może być implementowane w różny sposób w różnych przeglądarkach, zapewnia to lepszą kontrolę.

Aby dowiedzieć się więcej o obiekcie Javascript Date, jest to dobre źródło: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

koanima
źródło
-2

Myślę, że na pierwotne pytanie można łatwo odpowiedzieć, pozostawiając coś przeoczonego do tej pory: prosty podział na ciąg. Zwracany czas jest ciągiem tekstowym, po prostu podziel go na ogranicznik „:” i złóż ciąg w dowolny sposób. Bez wtyczek, bez skomplikowanych skryptów. i proszę bardzo:

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
źródło
-3

Chociaż jest to starsze pytanie, ostatnio miałem to samo i wymyśliłem prostsze rozwiązanie, używając wyrażeń regularnych i funkcji zastępowania ciągów jako innej alternatywy (nie ma potrzeby korzystania z zewnętrznych bibliotek js ani polegania na interfejsie API internalizacji ECMAScript) :

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

To podejście wykorzystuje regex look-ahead do przechwycenia: ss końca łańcucha AM / PM i zastępuje część: ss spacją, zwracając resztę łańcucha nietkniętą. (Dosłownie mówi „Znajdź dwukropek z dwiema cyframi i spacją, po której następuje AM lub PM i zastąp dwukropek, dwie cyfry i część spacji tylko spacją).

To wyrażenie / podejście działa tylko w przypadku lokalizacji en-US i en-US-like. Jeśli chciałbyś uzyskać podobny wynik z, powiedzmy, brytyjskim angielskim (en-GB), który nie używa AM / PM, potrzebne jest inne wyrażenie regularne.

Opierając się na przykładowych wynikach oryginalnego pytającego, zakładam, że miały one do czynienia głównie z amerykańską publicznością i schematem czasu en-US.

Emu
źródło
-3

Po prostu przekonwertuj datę na ciąg, a następnie połącz żądane podciągi.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM
Bradley
źródło
3
Dodaj wyjaśnienie do swojego posta.
DigitCart,
5
toLocaleTimeStringzwraca inny ciąg w każdej przeglądarce w zależności od ustawień regionalnych. Nie możesz polegać na tych pozycjach, otrzymasz różne, prawdopodobnie błędne wyniki w przeglądarkach innych osób.
oriadam