Як я можу використовувати .toLocaleTimeString () без відображення секунд?


163

Зараз я намагаюся відобразити час користувача, не відображаючи секунд. Чи є спосіб це зробити за допомогою .toLocaleTimeString () Javascript?

Робити щось подібне:

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

відображатиме час користувача з кожною одиницею, наприклад, він відображається в 15:39:15. Чи я в змозі відобразити ту саму струну, лише без секунд? (наприклад, 15:39)

Відповіді:


317

Ви завжди можете встановити параметри, виходячи з цієї сторінки, яку ви можете встановити, щоб позбутися від секунд, щось подібне

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

Підтримується Firefox, Chrome, IE9 + та Opera. Спробуйте це на консолі веб-браузера.


2
Дякую, я шукав цією годиною відповідь.
MustafaP

5
FYI hour: "2-digit"не працює для мене в Chrome 42 і FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})повертається "6:15 AM"в обох.
user9645

16
використовувати, []щоб не залишати конкретний локал. Таким чином ви залишаєтесь на toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
локальній

12
працює в хромі 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol

1
так, минуло 4 роки, як я опублікував це, тут багато чого змінилося. Недарма вам більше не потрібно її вказувати. З повагою
CJLopez

10

Це працює для мене:

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

6
Варто зазначити, що станом на березень 2020 року, опція timeStyle підтримується лише в Chrome і Opera , а не в Firefox, Edge / IE та Safari. Якщо ви хочете широкого висвітлення, зараз, мабуть, краще дотримуватися варіантів годин і хвилин.
обліпиха

Для Safari / iOS це працює лише в США, де у вас є AM / PM. en-US відображатиметься 15:16, інші місцеположення відображатимуться 15:16:00.
PassKit

8

Значення, повернене Date.prototype.toLocaleString , залежить від реалізації, тому ви отримуєте те, що отримуєте. Ви можете спробувати проаналізувати рядок, щоб видалити секунди, але вона може бути різною у різних браузерах, тому вам потрібно буде враховувати кожен браузер, який використовується.

Створити власний однозначний формат не складно, використовуючи методи Date. Наприклад:

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
НЕ розбирайте рядок, повернуту з toLocaleTimeString. Я був кілька років без жодних проблем. Але потім сьогодні я помітив, що це не працює. Виявляється, є спеціальні символи unicode (наприклад, 0x200E, позначка зліва направо), які неможливо обробити Date.parse. Ніколи не бачив, щоб це прийшло. Тож я перестану користуватися всіма функціями локалі та просто будую власні рядки, відформатовані часом. Це вбереже мене від злих сюрпризів, як цей.
Гейб Гальсмер

@ GabeHalsmer - я не хочу і ніколи не рекомендую дозволити Date.parse розбирати рядки (наприклад, останній абзац тут ). Але це тут не має значення, це зовсім не згадується, ви неправильно зрозуміли відповідь, якщо вважаєте, що це є (наприклад, " Ви можете спробувати розібратися ...").
RobG

Приємне посилання. Отже, підсумовуючи, люди повинні зробити власний розбір або власний метод ToString, оскільки принципи Date.prototype.toLocalString і Date.parse несумісні. Створення ToString видалося мені найлегшою справою. Але ти реалізував, що ти власний розбір. Так що або буде працювати для людей. Найважливішим, про що я хотів зробити всім відомо, це те, що Date.parse не працює з toLocaleString. І мені знадобилися години, щоб простежити цю несумісність через те, наскільки вона була тонка. Мітки зліва направо невидимі в налагоджувачі Visual Studio.
Гейб Халсмер

Класно, ще одне вкрай неправильне голосування. Недарма люди не хочуть ставити їм свої імена.
RobG

Для зберігання та транспортування дат в інші формати, toISOString і getTime, ймовірно, забезпечують найбезпечніший формат дати для повторної повторної публікації. Мені невідомо, що жодна реалізація JS за останнє десятиліття не обробляла мілісекундну версію UTC, повернуту з getTime, а значення ISO також були в специфікаціях як проаналізований формат дати протягом часу loooonnng. Але ніколи не читайте дати з елементів інтерфейсу. Це має виходити з вашого шару програми. І завжди тестуйте в Safari. У них на рівні IE6 були обривки щодо об’єкта дати.
Ерік Reppen


0

Я також шукав рішення цієї проблеми, ось що я врешті-решт придумав:

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

Ви можете спробувати тут: http://jsfiddle.net/B5Zrx/

\ u200E - це якийсь символ форматування, який я бачив у якійсь версії IE (це знак Unicode зліва направо).

Я припускаю, що якщо відформатований час містить щось на кшталт "XX: XX: XX", тоді він повинен пройти час із секундами, і я видаляю останню частину, якщо я не знайду цю схему, нічого не зміниться. Досить безпечно, але є ризик залишити секунди за якихось дивних обставин.

Я просто сподіваюся, що не існує локалі, який би змінив порядок форматованих часових частин (наприклад, зроби це ss: mm: hh). Ця позначка зліва направо змушує мене нервувати з цього приводу, тому я не знімаю позначку справа наліво (\ u202E) - я вважаю за краще не знайти відповідність у цьому випадку і залишити час у такому випадку відформатований секундами.


1
+1 Ви єдиний , хто відповів на питання правильно. Подяка товариш
mate64

1
Це робить багато припущень щодо того, що toLocaleTimeString()повертає, що може бути неправдивим для всіх локалів.
AJ Richardson

0

Ви можете спробувати це, що працює на мої потреби.

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

або

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

6
Це не працюватиме, оскільки інші мови можуть використовувати зовсім інший роздільник, ніж :.
Джон Купс

-2

Ось функція, яка буде виконувати це, із коментарями, що пояснюють:

  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
  }

Оскільки, як зазначали інші, toLocaleTimeString () може бути реалізований по-різному в різних браузерах, цей спосіб забезпечує кращий контроль.

Щоб дізнатися більше про об'єкт Javascript Date, це хороший ресурс: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


-2

Я думаю, що на оригінальне запитання можна легко відповісти, окрім того, що поки що не помічено: простий розкол рядків. Час, що повертається, - це текстовий рядок, просто розділіть його на роздільник ":" і зберіть рядок так, як вам потрібно. Ніяких плагінів, ніяких складних сценаріїв. і ось ви йдете:

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

Незважаючи на те, що це питання старіше, у мене було те саме нещодавно, і я придумав більш просте рішення, використовуючи регулярні вирази та функцію заміни рядків як іншу альтернативу (немає потреби у зовнішніх бібліотеках js або покладанні на інтерфейс API інтерналізації ECMAScript) :

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

Цей підхід використовує регулярний вираз, щоб перехопити: ss AM / PM кінець рядка і замінює: ss частину пробілом, повертаючи решту рядка недоторканою. (Буквально сказано: "Знайдіть двокрапку з двома цифрами та пробілом, за яким слід або AM, або PM, і замініть двокрапку, дві цифри та пробіл просто пробілом".

Цей вираз / підхід працює лише для en-US та en-US-подібних локалів. Якщо ви також хотіли подібного результату, скажімо, з англійської англійської мови (en-GB), яка не використовує AM / PM, потрібен інший регулярний вираз.

Грунтуючись на вибірці вихідного опитувача, я припускаю, що вони мали справу переважно з американською аудиторією та схемою часу в США.


-3

Просто перетворіть дату в рядок, а потім з'єднайте потрібні підрядки.

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

3
Будь ласка, додайте пояснення до своєї публікації.
DigitCart

5
toLocaleTimeStringповертає різний рядок у кожному веб-переглядачі, залежно від параметрів мови Ви не можете розраховувати на ці позиції, ви отримаєте різні, ймовірно, зламані результати у чужих браузерах.
oriadam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.