Javascript:将 24 小时时间字符串转换为 12 小时时间,上午/下午且无时区

Posted

技术标签:

【中文标题】Javascript:将 24 小时时间字符串转换为 12 小时时间,上午/下午且无时区【英文标题】:Javascript: convert 24-hour time-of-day string to 12-hour time with AM/PM and no timezone 【发布时间】:2012-12-03 14:52:45 【问题描述】:

服务器正在发送此格式的字符串:18:00:00。这是一个独立于任何日期的时间值。如何在javascript中将其转换为6:00PM?我可以将今天的日期作为字符串添加到服务器发送的值中,然后解析组合值,然后尝试 Date 对象的 .toTimeString() 方法,但时间方法发出的格式是 24 小时制时间和秒块.我可以写一个函数,但是有什么内置的吗?

【问题讨论】:

【参考方案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>

【讨论】:

感谢“没有内置”的回答和使用正则表达式的函数。 @HBP 当没有日期时,只有时间是字符串,你可以将 24 小时格式转换为 12 小时格式的唯一方法是只有你的代码对我有用,谢谢 我想,我们需要一个时间空间[5] = +time[0] 但它仅适用于 PM。对于 AM,它不会将 AM 附加到时间 我认为时间分钟和秒字段总是两位数。如果您真的需要一位数秒,请通过添加一个来更改正则表达式?在秒的 ']' 和 '\d' 之间。【参考方案2】:

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

要知道时间,请(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;

http://jsfiddle.net/Skwt7/4/

假设上午时间的格式为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;

http://jsfiddle.net/Skwt7/3/

【讨论】:

感谢使用 substr 的函数。由于 HBP 的解决方案删除了​​秒块,即使您的答案是第一个,我也会给他绿色检查。此外,他只有 3K;你的积分是 21K :-) 啊。不知何故,我没有注意到您想删除秒数。 如果是下午 12:30 会怎样 @isaksham - 下午 12:30 表示为 HH:MM:SS 是 12:30:00。如果您在我上面的代码中使用var timeString = "12:30:00",您将得到"12:30PM" 的输出,正如预期的那样。我曾经和一群俄罗斯人一起工作,他们对美国使用 AM 和 PM 的方式感到困惑。从上午 11:59 过渡到下午 12:00 对他们来说毫无意义。解释是 PM 的意思是“中午之后”,中午就是中午。 @gilly3 如何显示两位数的小时而不是像 06:30 而不是 6:30 的一个小时【参考方案3】:

toLocaleTimeString() 使这变得非常简单。 不再需要自己做这件事了。如果你不使用字符串方法攻击日期,你会更快乐,活得更久。

const timeString = '18:00:00'
// Append 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
&lt;h1 id='myTime'&gt;&lt;/h1&gt;

【讨论】:

+1。我真的希望更快乐,更长寿!具体来说,是什么导致秒块在输出时被抑制?是因为 seconds 属性未定义吗? 是的。如果你不指定任何东西,一切都会出来。一旦你开始指定,你只会得到你想要的。祝你长寿! 这是个好方法 我正在使用此代码,但在我的国家/地区它没有显示上午/下午。它将显示 CH 替换。如何解决这个问题? toLocaleTimeString 的第一个参数是文化。它曾经是空的,但我现在已将答案更新为“en-US”,因为该问题专门要求 AM/PM。这显然会破坏本地化,但应该可以解决您的问题。你来自哪个国家 ?如果你运行navigator.language,你会看到什么?【参考方案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;
;

https://jsfiddle.net/fpjs9g0L/

【讨论】:

【参考方案5】:

短 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】:

最好用momentjs

只是从“下午 2 点”到“14:00”的一小段对话

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

//“14.00”“14.00”到“2 PM”

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

【讨论】:

【参考方案7】:

在研究同一个问题时,我遇到了几个复杂、难以理解的解决方案,然后我突然意识到:有一个非常简单的解决方案,它不依赖于难以阅读的正则表达式或其他复杂的代码。除非我遗漏了一些明显的东西,否则这是一个非常简单易懂的解决方案:

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

【讨论】:

投反对票:timeTo12HrFormat("00:00:00") 给出“0:00:00 AM”而不是“12:00:00 AM”【参考方案8】:

一个简单的代码将是

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';

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

【讨论】:

【参考方案9】:

这是我使用 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'))

【讨论】:

Bug:00:08:00 被转换为00:08 am 而不是12:08 am【参考方案10】:

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

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

//// 输出:08:00

如果你想转换成上午和下午

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

//// 输出:08:00 pm

【讨论】:

【参考方案11】:

假设您将获得正确格式的日期字符串,我有一个解决方案。

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"

【讨论】:

【参考方案12】:

确保您的时间采用这种格式 HH:MM:SS(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(':'));

【讨论】:

【参考方案13】:

以下是一些可行的变体。

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]
))

【讨论】:

【参考方案14】:

如果您使用的是 ES6,这可能有助于格式化。 下面的代码 sn-p 将忽略秒。如果要考虑秒数,可以将其添加为第一个参数。

   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
    

【讨论】:

【参考方案15】:

感谢@HBP 在这里铺平道路!

我发现这为解决方案增加了一点灵活性。

RegEx 已更新以适应中午之前的时间。

此解决方案允许您将任何字符串传递给它。只要有效时间(格式为 18:00 || 18:00:00 || 3:00 || 3:00:00)在该字符串中的某个位置,就可以开始了。

注意:您可以只使用 militaryToTweleveHourConverter 或从 parseTime 变量中取出胆量。但是,我使用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

【讨论】:

【参考方案16】:
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);

这里是用日期将时间转换为上午或下午的函数,它可能对某人有所帮助。

【讨论】:

【参考方案17】:
function Time_Function() 
var date = new Date()
var time =""
var x= "AM"
if(date.getHours() >12)
    x= "PM"

time= date.getHours()%12 + x +":"+ date.getMinutes() +":"+ date.getSeconds()

【讨论】:

【参考方案18】:
function timeConversion(s) 
    let hour = parseInt(s.substring(0,2));
    hour = s.indexOf('AM') > - 1 && hour === 12 ? '00' : hour;
    hour = s.indexOf('PM') > - 1 && hour !== 12 ? hour + 12 : hour;
    hour = hour < 10 && hour > 0 ? '0'+hour : hour;

    return hour + s.substring(2,8);

【讨论】:

以上是关于Javascript:将 24 小时时间字符串转换为 12 小时时间,上午/下午且无时区的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何将日期从上午/下午转换为 24 小时格式

将小时和分钟字符串转换为纪元(unix 时间戳)

当用户的设备在 iOS 中设置为 24 小时制时,如何将包含“am/pm”的字符串转换为 NSDate?

[12小时Javascript Clock显示24时间,错误的AM / PM

Momentjs:将 12 小时转换为日期对象

将 12 小时转换为 24 小时时间