Javascript:将24小时制的时间字符串转换为带有AM / PM和无时区的12小时制时间

71
服务器发送的内容格式是:18:00:00,这是一个独立于任何日期的一天中的时间值。如何在Javascript中将其转换为6:00PM?您可以将当天的日期作为字符串添加到服务器发送的值之前,然后解析组合的值,再尝试使用Date对象的.toTimeString()方法。但是这个方法发出的格式是24小时制带有秒数。您可以编写一个函数,但是否有内置的方法可用?
25个回答

138

没有内置的功能,我的解决方案如下:

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指示并调整小时来进行调整。

如果提供了有效的时间,则返回值为调整后的时间;否则返回原始字符串。

Working example

(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>


感谢您的回答“没有内置”的问题,以及使用正则表达式的函数。 - Tim
@HBP 当字符串中没有日期,只有时间时,将24小时制转换为12小时制的唯一方法是使用您的代码。非常感谢您的帮助。 - skhurams
1
我认为我们需要在 time[5] = +time[0] < 12 ? 'AM' : 'PM'; // 设置上午/下午 之间加一个空格,以便进一步使用任何计算或其他操作: time[5] = +time[0] < 12 ? ' AM' : ' PM'; // 设置上午/下午 - sanjeev shetty
1
我认为时间的分钟和秒字段始终是双位数。如果你真的需要单个数字的秒钟,可以通过在秒钟的']'和'\d'之间添加一个?来更改RegExp。 - HBP
自2016年左右开始,已经有了内置的功能,不需要自己再去做这件事情了。 - bbsimonbb
显示剩余2条评论

65

toLocaleTimeString()让这变得非常简单。 不再需要自己去做这个了。如果你不尝试使用字符串方法处理日期的话,你会更加快乐并且长寿。(它们会反击)

const timeString = '18:00:00'
// Prepend any date. Use your birthday.
const timeString12hr = new Date('1970-01-01T' + timeString + 'Z')
  .toLocaleTimeString('en-US',
    {timeZone:'UTC',hour12:true,hour:'numeric',minute:'numeric'}
  );
document.getElementById('myTime').innerText = timeString12hr
<h1 id='myTime'></h1>


1
+1. 我希望更快乐、更长寿!具体而言,是什么导致了输出时省略了秒数块?是因为“seconds”属性未定义吗? - Tim
是的。如果您不指定任何内容,一切都会出现。一旦开始指定,您只会得到您所要求的内容。祝您长寿快乐! - bbsimonbb
1
这是一个很好的方式。 - Samiksha Jagtap
我正在使用这段代码,但在我的国家它不显示AM/PM。它会显示CH替换。如何解决这个问题? - huykon225
1
toLocaleTimeString的第一个参数是文化。它以前是空的,但我现在已经更新了答案为'en-US',因为问题特别要求AM/PM。这显然破坏了本地化,但应该可以解决你的问题。你来自哪个国家?如果你运行navigator.language,会看到什么? - bbsimonbb

56

要获取AM/PM,请检查小时部分是否小于12,如果小于12,则为AM,否则为PM。

要获取小时数,请使用(hour % 12) || 12

这应该就可以了:

function formatTime(timeString) {
    const [hourString, minute] = timeString.split(":");
    const hour = +hourString % 24;
    return (hour % 12 || 12) + ":" + minute + (hour < 12 ? "AM" : "PM");
}

const tests = [
    "18:00:00",
    "6:00:00",
    "06:00:00",
    "12:00:00",
    "00:00:00",
    "24:00:00",
];
for (const s of tests) {
    console.log(formatTime(s));
}


感谢使用substr函数。由于HBP的解决方案删除了秒数块,所以我会给他绿色勾选,即使你的答案是第一个。此外,他只有3K分,而你已经拥有21K分了 :-) - Tim
啊,不知何故我没注意到你想要移除秒数。 - gilly3
@isaksham - 下午12:30表示为HH:MM:SS是12:30:00。如果您在上面的代码中使用var timeString =“12:30:00”,则将获得预期的输出“12:30 PM”。我曾经与一群俄罗斯人合作,他们对美国人使用AM和PM的方式感到困惑。对他们来说,从上午11:59转换到下午12:00毫无意义。解释是PM表示“中午后”,而正午是中午。 - gilly3
谢谢你的回答,但是我们能不能不使用超过一个字符的变量名呢?“h”和“H”的区别太不清晰了。 - Vincent
@Vincent - 当然!Stackoverflow是用来学习的,而不是复制粘贴。变量名可以按照你的喜好来命名。我使用了Hh,因为它们对应一些常见的日期格式字符串变量,其中小写的h对应12小时制时间,大写的H对应24小时制时间,但如果这些约定对你不熟悉,在你的代码中使用任何你喜欢的变量名即可。 - gilly3
显示剩余4条评论

15

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

https://jsfiddle.net/fpjs9g0L/


13

最好使用momentjs

将“2 PM”转换为“14.00”只需要一点点谈话

const number = moment("02:00 PM", ["h:mm A"]).format("HH:mm");
cosole.log(number); 

// "14.00" "14.00" to "2 PM"

// "14.00"和"14.00"转换成"2 PM"
const number = moment("14.00", ["HH.mm"]).format("hh:mm a");
cosole.log(number); // "02:00 pm"

13

ES6简短代码

const convertFrom24To12Format = (time24) => {
  const [sHours, minutes] = time24.match(/([0-9]{1,2}):([0-9]{2})/).slice(1);
  const period = +sHours < 12 ? 'AM' : 'PM';
  const hours = +sHours % 12 || 12;

  return `${hours}:${minutes} ${period}`;
}
const convertFrom12To24Format = (time12) => {
  const [sHours, minutes, period] = time12.match(/([0-9]{1,2}):([0-9]{2}) (AM|PM)/).slice(1);
  const PM = period === 'PM';
  const hours = (+sHours % 12) + (PM ? 12 : 0);

  return `${('0' + hours).slice(-2)}:${minutes}`;
}

6
这的简单代码如下:
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';

您可以根据自己的时间格式进行调整。


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

1
被投反对票:timeTo12HrFormat("00:00:00") 的输出是 "0:00:00 AM" 而不是 "12:00:00 AM"。 - Frédéric Camblor

5

通过使用 Moment 库,我们可以将24小时时间格式转换为12小时时间格式。

moment('20:00', 'hh:mm').format('hh:mm')

//// 输出:08:00

如果您想将其转换为上午和下午

moment('20:00', 'hh:mm a').format('hh:mm a')

//// 输出:下午8:00


2

如果您需要在输出中获取不带秒的时间

const convertTime24to12 = (time24h) => {
  let time = time24h
    .toString()
    .match(/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time24h];

  if (time.length > 1) {
    time = time.slice(1, -1);
    time[5] = +time[0] < 12 ? ' am' : ' pm';
    time[0] = +time[0] % 12 || 12;
  }
  return time.join(''); 
};


15:40:00
console.log(convertTime24to12("13:40:00"));

03:40


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接