Как мне использовать .toLocaleTimeString () без отображения секунд?

163

В настоящее время я пытаюсь отобразить время пользователя без отображения секунд. Есть ли способ, которым я могу сделать это, используя Javascript .toLocaleTimeString ()?

Делать что-то вроде этого:

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

будет отображать время пользователя с каждой единицей, например, в настоящее время он показывает 3:39:15 вечера. Могу ли я отобразить эту же строку без секунд? (например, 3:39 вечера)

javadog36
источник

Ответы:

317

Вы всегда можете установить параметры, основываясь на этой странице, которую вы можете установить, чтобы избавиться от секунд, что-то вроде этого

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

Поддерживается Firefox, Chrome, IE9 + и Opera. Попробуйте это на консоли вашего браузера.

CJLopez
источник
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'}
Hafenkranich
12
работает в chrome 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol
1
да, прошло 4 года с тех пор, как я разместил это здесь, так много всего изменилось. Неудивительно, что вам больше не нужно указывать это. С
наилучшими
10

Это работает для меня:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});
Floris Looijesteijn
источник
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');
}
RobG
источник
7
НЕ анализируйте строку, возвращенную из toLocaleTimeString. Я был в течение нескольких лет без каких-либо проблем. Но сегодня я заметил, что это не работает. Оказывается, есть специальные символы Юникода (например, 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 также были в спецификациях в качестве формата разбираемой даты для более длительного времени. Но никогда не читайте даты из элементов пользовательского интерфейса. Это должно исходить от уровня вашего приложения. И всегда тестируйте в Safari. Они были придурками уровня IE6 по поводу объекта даты.
Эрик Реппен
7

С локалями:

var date = new Date();
date.toLocaleTimeString('fr-FR', {hour: '2-digit', minute: '2-digit'})
Микаэль Остони
источник
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 (это метка слева направо в юникоде).

Я предполагаю, что если форматированное время содержит что-то вроде «XX: XX: XX», то это должно быть время с секундами, и я удаляю последнюю часть, если я не нахожу этот шаблон, ничего не меняется. Довольно безопасно, но в некоторых странных обстоятельствах есть риск оставить секунды.

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

аги.
источник
1
+1 Вы единственный , кто ответил на вопрос правильно. Спасибо друг
mate64
1
Это делает много предположений о том, что toLocaleTimeString()возвращает, что не может быть правдой для всех языков.
AJ Ричардсон
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

koanima
источник
-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-like Locales. Если вы также хотели получить похожий результат, скажем, с британским английским (en-GB), который не использует AM / PM, необходимо другое регулярное выражение.

Исходя из примера вывода оригинального вопроса, я предполагаю, что они в основном имели дело с американской аудиторией и временной схемой в США.

Эму
источник
-3

Просто преобразуйте дату в строку, а затем объедините нужные подстроки из нее.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM
Bradley
источник
3
Пожалуйста, добавьте некоторые пояснения к вашему сообщению.
DigitCart
5
toLocaleTimeStringвозвращает разные строки в каждом браузере в зависимости от настроек локали. Вы не можете полагаться на эти позиции, вы получите другие, возможно, ошибочные результаты в браузерах других людей.
Ориадам