Преобразование 24 часа времени в 12 часов (PM / AM)

369
01 марта 2017, 21:35

Необходимо преобразовать время из 24 – часового формата в 12-часовой формат Вот мой код, я использовал последнюю строку кода из интернета, что преобразует 24 часа в 12, но синтиксис (hour >= 12)? hour - 12: hour; мне не понятен, почему просто не использовать функцую с conditional statement if? И зачем нужен такой формат? Ребята помогите плиз !

var today = new Date();
var day = today.getDay();
var daylist = ["Sunday","Monday","Tuesday","Wednesday ","Thursday","Friday","Saturday"];
console.log("Today is : " + daylist[day] + ".");
var hour = today.getHours();
var minute = today.getMinutes();
var second = today.getSeconds();
var prepand = (hour >= 12)? " PM ":" AM ";
hour = (hour >= 12)? hour - 12: hour;
Answer 1

Это тернарный оператор. Для лучшего понимания почитайте тут: https://ru.wikipedia.org/wiki/Тернарная_условная_операция

Безотносительно к определённому языку программирования тернарную операцию можно определить так:

логическое выражение ? выражение 1 : выражение 2

Алгоритм работы операции следующий:

  1. Вычисляется логическое выражение.
  2. Если логическое выражение истинно, то вычисляется значение выражения "выражение 1", в противном случае — значение выражения "выражение 2".
  3. Вычисленное значение возвращается.

В Вашем случае:

hour = (hour >= 12)? hour - 12: hour;

заменить можно на:

if (hour >= 12) 
    hour = hour - 12;
else
    hour = hour;

Как видите это требует большего кол-ва кода, требует больше времени на понимания происходящего. Для сокращения кода и используют тернарный оператор ?:

Answer 2

А не проще-ли использовать стандартный функционал вывода даты?

var date = new Date(); 
 
// Запрашиваем нужный формат вывода даты 
var options = {  
      weekday: 'long',  
      year: 'numeric', 
      month: 'long',  
      day: 'numeric' ,  
      hour:  'numeric',  
      hour12 : true, // время в AM-PM формате 
      minute : 'numeric' 
}; 
console.log(date.toLocaleString('en-US', options));

Answer 3

hour = (hour >= 12)? hour - 12: hour;

Тернарный оператор имеет вид:

 Условие ? РезультатЕслиИстинно : РезультатЕслиЛожно  

Т.е. код выше, дословно обозначает:

  if (hour >= 12) {
    hour = hour - 12;
  } else {
    hour = hour;
  }

Из-за бессмысленной ветки else вариант if (hour >= 12) hour -= 12 может быть более предпочтительным.

Этот код выдаст вам время 0:15 am для четверти первого ночи, в то время как должно быть 12:15 am.

Предлагаю воспользоваться вот такой заменой:

hour= hour % 12 || 12;

Здесь мы берём остаток от деления на 12, но если он равен нулю результат равен 12.

Answer 4

Тернарный оператор не есть по сути заменой условному оператору if. Его использование оправдывается при встраивании небольшых условных веток прямо в выражения. Если вам нужно уже сделать условие вне выражения, лучше использовать if...else. То-есть в вашем случае код вида

if(hour >= 12){
  hour = hour - 12;
}else{
  hour = hour;
}

превращается в hour = (hour >= 12)? hour - 12: hour; .

Answer 5

Можно использовать Date.prototype.toLocaleTimeString() с локалем en-US.

Например, так: date.toLocaleTimeString('en-US'), что даст время в формате, к примеру "1:00:00 PM"

Подробнее здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString

READ ALSO
vuejs кастом директива с директивами в нутри

vuejs кастом директива с директивами в нутри

Как можно в кастом директиве через innerHTML задать хтмл с другими директивами или интерполяцией:

242
Вопроизведение только одного ролика youtube на странице

Вопроизведение только одного ролика youtube на странице

Есть страница, на которой несколько видео с youtubaВидео выводятся с помощью foreach

276
Добавить класс корзине если она не пуста

Добавить класс корзине если она не пуста

Добрый день всем! Помогите решить проблему) Есть кусок кода

247