Сервер отправляет строку в этом формате: 18:00:00
. Это значение времени, не зависящее от даты. Как преобразовать его в 6:00PM
в Javascript? Я мог бы добавить сегодняшнюю дату в виде строки к значению, отправленному сервером, а затем проанализировать объединенные значения, а затем попробовать метод .toTimeString()
объекта Date, но формат, который использует метод времени, 24-часовое время с секцией секунд, Я мог бы написать функцию, но есть ли что-то встроенное?
Javascript: конвертировать 24-часовую строку времени в 12-часовой период с AM/PM и без часовой пояс
Ответ 1
Ничего встроенного, мое решение будет следующим:
function tConvert (time) {
// Check correct time format and split into components
time = time.toString ().match (/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];
if (time.length > 1) { // If time format correct
time = time.slice (1); // Remove full string match value
time[5] = +time[0] < 12 ? 'AM' : 'PM'; // Set AM/PM
time[0] = +time[0] % 12 || 12; // Adjust hours
}
return time.join (''); // return adjusted time or original string
}
tConvert ('18:00:00');
Эта функция использует регулярное выражение для проверки строки времени и разделения ее на составные части. Также обратите внимание, что секунды во времени могут быть опущены. Если было представлено действительное время, оно корректируется путем добавления индикации AM/PM и корректировки часов.
Возвращаемое значение - это скорректированное время, если было представлено правильное время или исходная строка.
Рабочий пример
(function() {
function tConvert(time) {
// Check correct time format and split into components
time = time.toString().match(/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];
if (time.length > 1) { // If time format correct
time = time.slice(1); // Remove full string match value
time[5] = +time[0] < 12 ? 'AM' : 'PM'; // Set AM/PM
time[0] = +time[0] % 12 || 12; // Adjust hours
}
return time.join(''); // return adjusted time or original string
}
var tel = document.getElementById('tests');
tel.innerHTML = tel.innerHTML.split(/\r*\n|\n\r*|\r/).map(function(v) {
return v ? v + ' => "' + tConvert(v.trim()) + '"' : v;
}).join('\n');
})();
<h3>tConvert tests : </h3>
<pre id="tests">
18:00:00
18:00
00:00
11:59:01
12:00:00
13:01:57
24:00
sdfsdf
12:61:54
</pre>
Ответ 2
Чтобы получить AM/PM, проверьте, что часовая часть меньше 12, то это AM, иначе PM.
Чтобы получить час, сделайте (hour % 12) || 12
(hour % 12) || 12
Это должно сделать это:
var timeString = "18:00:00";
var H = +timeString.substr(0, 2);
var h = H % 12 || 12;
var ampm = (H < 12 || H === 24) ? "AM" : "PM";
timeString = h + timeString.substr(2, 3) + ampm;
Это предполагает, что время AM форматируется как, например, 08:00:00
. Если они отформатированы без начального нуля, вам придется проверить позицию первого двоеточия:
var hourEnd = timeString.indexOf(":");
var H = +timeString.substr(0, hourEnd);
var h = H % 12 || 12;
var ampm = (H < 12 || H === 24) ? "AM" : "PM";
timeString = h + timeString.substr(hourEnd, 3) + ampm;
Ответ 3
toLocaleTimeString() делает это очень простым. Нет необходимости делать это самостоятельно. Вы будете счастливее и будете жить дольше, если не будете атаковать даты строковыми методами.
const timeString = '18:00:00'
// Append any date. Use your birthday.
const timeString12hr = new Date('1970-01-01T' + timeString + 'Z')
.toLocaleTimeString({},
{timeZone:'UTC',hour12:true,hour:'numeric',minute:'numeric'}
);
document.getElementById('myTime').innerText = timeString12hr
<h1 id='myTime'></h1>
Ответ 4
Основано на ответе gilly3.
Если вы хотите конвертировать:
08:00 to 08:00 AM
16:00 to 04:00 PM
Тогда это будет работать:
function tConv24(time24) {
var ts = time24;
var H = +ts.substr(0, 2);
var h = (H % 12) || 12;
h = (h < 10)?("0"+h):h; // leading 0 at the left for 1 digit hours
var ampm = H < 12 ? " AM" : " PM";
ts = h + ts.substr(2, 3) + ampm;
return ts;
};
Ответ 5
Изучая этот же вопрос, я столкнулся с несколькими сложными, трудными для понимания решениями, и тогда это меня озарило: существует очень простое решение, которое не зависит от трудночитаемых регулярных выражений или другого сложного кода. Если я не пропущу что-то очевидное, это чрезвычайно простое и понятное решение:
function timeTo12HrFormat(time)
{ // Take a time in 24 hour format and format it in 12 hour format
var time_part_array = time.split(":");
var ampm = 'AM';
if (time_part_array[0] >= 12) {
ampm = 'PM';
}
if (time_part_array[0] > 12) {
time_part_array[0] = time_part_array[0] - 12;
}
formatted_time = time_part_array[0] + ':' + time_part_array[1] + ':' + time_part_array[2] + ' ' + ampm;
return formatted_time;
}
var time = timeTo12HrFormat(18:00:00);
console.log(time); // 6:00:00 PM
Ответ 6
Предполагая, что вы получите строку даты в правильном формате, у меня есть решение.
function parseDateTime(dt) {
var date = false;
if (dt) {
var c_date = new Date(dt);
var hrs = c_date.getHours();
var min = c_date.getMinutes();
if (isNaN(hrs) || isNaN(min) || c_date === "Invalid Date") {
return null;
}
var type = (hrs <= 12) ? " AM" : " PM";
date = ((+hrs % 12) || hrs) + ":" + min + type;
}
return date;
}
parseDateTime("2016-11-21 12:39:08");//"12:39 AM"
parseDateTime("2017-11-21 23:39:08");//"11:39 PM"
Ответ 7
Я предпочитаю использовать силу собственного объекта Date javascript вместо того, чтобы усложнять вещи регулярными выражениями и проверками. Кроме того, я думал, что лучше всего добавить нули для однозначных часов. Я написал этот format-12h component, который решает проблему, как я уже упоминал выше.
Вы можете посмотреть на код и результаты тестов. Не стесняйтесь импортировать его и использовать, как показано в этих примерах:
format12h(new Date(2017,06,04,10,45,10)) => 10:45 am
format12h(new Date(2017,06,04,23,45,10)) => 11:45 pm
format12h(new Date(2017,06,04,23,45,10), true) => 11:45:10 pm
Ответ 8
Убедитесь, что ваше время в этом формате ЧЧ: ММ: СС (PM/AM)
function timeConversion(s) {
s = s.split(':');
var time = s[2];
if(time.charAt(2) === 'A' && parseInt(s[0]) == 12) s[0] = '00';
if(time.charAt(2) === 'P' && parseInt(s[0]) <12) s[0] = parseInt(s[0])+12;
if(s[0] >=24) s[0]-=24;
var x = time.split('').slice(0,2);
s[2] = x.join('');
console.log(s.join(':'));
}
Ответ 9
Вот несколько вариантов, которые будут работать.
const oneLiner = (hour = "00", min = "00", sec = "00") => '${(hour % 12) || 12}:${("0" + min).slice(-2)}:${sec} ${(hour < 12) ? 'am' : 'pm'}'
console.log('oneliner', oneLiner(..."13:05:12".split(":")))
const oneLinerWithObjectInput = ({hour = "00", min = "00", sec = "00"} = {}) => '${(hour % 12) || 12}:${("0" + min).slice(-2)}:${sec} ${(hour < 12) ? 'am' : 'pm'}'
console.log('onelinerWithObjectInput', oneLinerWithObjectInput({
hour: "13:05:12".split(":")[0],
min: "13:05:12".split(":")[1],
sec: "13:05:12".split(":")[2]
}))
const multiLineWithObjectInput = ({hour = "00", min = "00", sec = "00"} = {}) => {
const newHour = (hour % 12) || 12
, newMin = ("0" + min).slice(-2)
, ampm = (hour < 12) ? 'am' : 'pm'
return '${newHour}:${newMin}:${sec} ${ampm}'
}
console.log('multiLineWithObjectInput', multiLineWithObjectInput({
hour: "13:05:12".split(":")[0],
min: "13:05:12".split(":")[1],
sec: "13:05:12".split(":")[2]
}))
Ответ 10
Вот мой способ использования операторов if.
const converTime = (time) => {
let hour = (time.split(':'))[0]
let min = (time.split(':'))[1]
let part = hour > 12 ? 'pm' : 'am';
min = (min+'').length == 1 ? '0${min}' : min;
hour = hour > 12 ? hour - 12 : hour;
hour = (hour+'').length == 1 ? '0${hour}' : hour;
return ('${hour}:${min} ${part}')
}
console.log(converTime('18:00:00'))
console.log(converTime('6:5:00'))
Ответ 11
Это может помочь отформатировать, если вы используете ES6.
Ниже фрагмент кода будет игнорировать секунды. Если вы хотите считать секунды, вы можете добавить это в качестве первого параметра.
const formatFrom24Hrsto12Hrs = (time, ignoreZero = true) => {
let [hours, minutes] = time.split(':')
let modifier = +hours < 12 ? 'am' : 'pm'
hours = +hours % 12 || 12
minutes = ignoreZero && +minutes === 0 ? '' : ':${minutes}'
return hours + minutes + modifier
}
Ответ 12
Спасибо @HBP за то, что проложили путь сюда!
Я нашел это, чтобы добавить немного гибкости к решению.
RegEx был обновлен с учетом времени до полудня.
Это решение позволяет вам передать любую строку. Пока правильное время (в этом формате 18:00 || 18:00:00 || 3:00 || 3:00:00) где-то в этой строке, вы можете идти.
Примечание: вы можете использовать только militaryToTweleveHourConverter
или вытащить parseTime
переменной parseTime
. Однако я форматирую дату из базы данных с помощью date-fns
затем date-fns
эту отформатированную дату в конвертер.
Полностью работает. Надеюсь это поможет.
import dateFns from 'date-fns';
//* +---------------------------+
//* Format ex. Sat 1/1/18 1:00pm
//* +---------------------------+
const formatMonthDayYearTime = date =>
militaryToTweleveHourConverter(
dateFns.format(new Date(date), 'ddd M/DD/YY H:mm')
);
//* +-------------------------------+
//* Convert MILITARY TIME to 12 hour
//* +-------------------------------+
const militaryToTweleveHourConverter = time => {
const getTime = time.split(' ');
const parseTime = getTime.map(res => {
// Check for correct time format and split into components or return non-time units unaltered
let timeUnit = res
.toString()
.match(/^([\d]|[0-1]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [res];
console.log('timeUnit', timeUnit);
// If the time format is matched, it will break the components into an array
// ie. ["19:00", "19", ":", "00", undefined]
if (timeUnit.length > 1) {
// Remove full string match value
timeUnit = timeUnit.slice(1);
// Set am/pm and assign it to the last index in the array
timeUnit[5] = timeUnit[0] < 12 ? 'am' : 'pm';
// Adjust hours by subtracting 12 from anything greater than 12 and replace the value in the hours index
timeUnit[0] = timeUnit[0] % 12 || 12;
}
// return adjusted time or original string
return timeUnit.join('');
});
// Re-assemble the array pieces into a string
return parseTime.join(' ');
};
console.log(formatMonthDayYearTime('Sat 9/17/18 18:30'));
// console log returns the following
// Mon 9/17/18 6:30pm
console.log(militaryToTweleveHourConverter('18:30'));
// console log returns the following
// 6:30pm
console.log(militaryToTweleveHourConverter('18:30:09'));
// console log returns the following
// 6:30:09pm
console.log(militaryToTweleveHourConverter('8:30:09'));
// console log returns the following
// 8:30:09am
Ответ 13
function timeformat(date1) {
var date=new Date(date1);
var month = date.toLocaleString('en-us', { month: 'long' });
var mdate =date.getDate();
var year =date.getFullYear();
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? 'pm' : 'am';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minutes = minutes < 10 ? '0'+minutes : minutes;
var strTime = mdate+"-"+month+"-"+year+" "+hours + ':' + minutes + ' ' + ampm;
return strTime;
}
var ampm=timeformat("2019-01-11 12:26:43");
console.log(ampm);
Здесь функция для преобразования времени в AM или PM с датой, это может помочь кому-то.
Ответ 14
Простой код для этого будет
time = time.split(':');// here the time is like "16:14"
let meridiemTime = time[0] >= 12 && (time[0]-12 || 12) + ':' + time[1] + ' PM' || (Number(time[0]) || 12) + ':' + time[1] + ' AM';
Вы можете настроить в соответствии с вашим форматом времени