Преобразование времени 24 часа в 12 часов с AM и PM с использованием Javascript - PullRequest
55 голосов
/ 04 февраля 2011

Каков наилучший способ преобразования следующего возвращаемого значения JSON из 24-часового формата в 12-часовой формат с AM и PM?Дата должна оставаться неизменной - время - единственное, что требует форматирования.

February 04, 2011 19:00:00

PS Использование jQuery, если это облегчает задачуТакже предпочел бы простую функцию / код и не использовать Date.js.

Ответы [ 23 ]

90 голосов
/ 18 января 2013

Так вы можете изменить часы без оператора if:

hours = ((hours + 11) % 12 + 1);
61 голосов
/ 04 февраля 2011

ОБНОВЛЕНИЕ 2: без секундной опции

ОБНОВЛЕНИЕ: ПОСЛЕ исправления после полудня, проверено: http://jsfiddle.net/aorcsik/xbtjE/

Я создал эту функцию длясделать это:

function formatDate(date) {
  var d = new Date(date);
  var hh = d.getHours();
  var m = d.getMinutes();
  var s = d.getSeconds();
  var dd = "AM";
  var h = hh;
  if (h >= 12) {
    h = hh - 12;
    dd = "PM";
  }
  if (h == 0) {
    h = 12;
  }
  m = m < 10 ? "0" + m : m;

  s = s < 10 ? "0" + s : s;

  /* if you want 2 digit hours:
  h = h<10?"0"+h:h; */

  var pattern = new RegExp("0?" + hh + ":" + m + ":" + s);

  var replacement = h + ":" + m;
  /* if you want to add seconds
  replacement += ":"+s;  */
  replacement += " " + dd;

  return date.replace(pattern, replacement);
}

alert(formatDate("February 04, 2011 12:00:00"));
35 голосов
/ 30 апреля 2012
    //it is pm if hours from 12 onwards
    suffix = (hours >= 12)? 'pm' : 'am';

    //only -12 from hours if it is greater than 12 (if not back at mid night)
    hours = (hours > 12)? hours -12 : hours;

    //if 00 then it is 12 am
    hours = (hours == '00')? 12 : hours;
15 голосов
/ 29 марта 2016

Для тех, кто читает, кому нужно ТОЛЬКО время в выводе, вы можете передать опции в метод JavaScript Date :: toLocaleString (). Пример:

var date = new Date("February 04, 2011 19:00:00");
var options = {
  hour: 'numeric',
  minute: 'numeric',
  hour12: true
};
var timeString = date.toLocaleString('en-US', options);
console.log(timeString);

timeString будет установлен на:

8: 00 AM

Добавьте "second: 'numeric'" к вашим опциям, если вам нужны секунды. Для всех вариантов см это .

6 голосов
/ 04 июня 2012

Вот довольно краткий способ сделать это с помощью прототипа:

Date.prototype.getFormattedTime = function () {
    var hours = this.getHours() == 0 ? "12" : this.getHours() > 12 ? this.getHours() - 12 : this.getHours();
    var minutes = (this.getMinutes() < 10 ? "0" : "") + this.getMinutes();
    var ampm = this.getHours() < 12 ? "AM" : "PM";
    var formattedTime = hours + ":" + minutes + " " + ampm;
    return formattedTime;
}

Тогда все, что вам нужно сделать, это преобразовать строковое значение в дату и использовать новый метод:

var stringValue = "February 04, 2011 19:00:00;
var dateValue = new Date(stringValue);
var formattedTime = dateValue.getFormattedTime();

или в одну строку:

var formattedTime = new Date("February 04, 2011 19:00:00").getFormattedTime();
4 голосов
/ 29 октября 2015

Держите это простым и чистым

var d = new Date();
var n = d.toLocaleString();

https://jsfiddle.net/rinu6200/3dkdxaad/#base

4 голосов
/ 12 сентября 2013

function pad(num) {return ("0" + num).slice(-2);}
function time1() {
  var today = new Date(),
    h = today.getHours(),
    m = today.getMinutes(),
    s = today.getSeconds();
    
  h = h % 12;
  h = h ? h : 12; // the hour '0' should be '12'
  clk.innerHTML = h + ':' + 
    pad(m) + ':' + 
    pad(s) + ' ' + 
    (h >= 12 ? 'PM' : 'AM');
}
window.onload = function() {
  var clk = document.getElementById('clk');
  t = setInterval(time1, 500);
}
<span id="clk"></span>
3 голосов
/ 04 февраля 2011

jQuery вообще не имеет никаких утилит Date. Если вы не используете никаких дополнительных библиотек, обычный способ - создать объект JavaScript Date, а затем извлечь из него данные и отформатировать его самостоятельно.

Для создания объекта Date вы можете либо убедиться, что ваша строка даты в JSON имеет форму, понятную Date, что является стандартом IETF (в основном это RFC 822 раздел 5 ). Так что, если у вас есть возможность изменить свой JSON, это будет проще всего. (РЕДАКТИРОВАТЬ: Ваш формат может действительно работать так, как он есть.)

Если вы не можете изменить свой JSON, то вам нужно самостоятельно проанализировать строку и получить день, год, год, часы, минуты и секунды в виде целых чисел и создать объект Date с этим.

Получив объект Date, вам нужно извлечь необходимые данные и отформатировать их:

   var myDate = new Date("4 Feb 2011, 19:00:00");
   var hours = myDate.getHours();
   var am = true;
   if (hours > 12) {
      am = false;
      hours -= 12;
   } else (hours == 12) {
      am = false;
   } else (hours == 0) {
      hours = 12;
   }

   var minutes = myDate.getMinutes();
   alert("It is " + hours + " " + (am ? "a.m." : "p.m.") + " and " + minutes + " minutes".);
2 голосов
/ 04 февраля 2011
date = date.replace(/[0-9]{1,2}(:[0-9]{2}){2}/, function (time) {
    var hms = time.split(':'),
        h = +hms[0],
        suffix = (h < 12) ? 'am' : 'pm';
    hms[0] = h % 12 || 12;        
    return hms.join(':') + suffix
});

изменить: я забыл иметь дело с 12:00 утра / вечера. Исправлено.

2 голосов
/ 04 февраля 2011

Вы можете взглянуть на это . Один из примеров говорит:

var d = new Date(dateString);

Если у вас есть объект Date, вы можете довольно легко с ним играть. Вы можете либо вызвать toLocaleDateString, toLocaleTimeString, либо проверить, больше ли getHours, чем 12, а затем просто вычислить время AM / PM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...