Javascript:使用 AM/PM 将 24 小时制时间字符串转换为 12 小时制,没有时区

IT技术 javascript time-format
2021-01-30 15:37:06

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

6个回答

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

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>

但它仅适用于 PM。对于 AM,它不会将 AM 附加到时间
2021-03-18 15:37:06
感谢“没有内置”的答案以及使用正则表达式的功能。
2021-03-23 15:37:06
我认为,我们需要一个空间 time[5] = +time[0] < 12 ?'上午下午'; // 将 AM/PM 设置为 time[5] = +time[0] < 12 ? ' 上午下午'; // 设置 AM/PM 以供进一步使用任何计算或其他内容
2021-04-06 15:37:06
@HBP 当没有日期只有时间是字符串时,您可以将 24 小时格式转换为 12 小时格式的唯一方法只是您的代码对我有用,谢谢
2021-04-07 15:37:06
我认为时间分钟和秒字段总是两位数。如果您真的需要一位数秒,请通过添加 ? ']' 和 '\d' 之间的秒。
2021-04-08 15:37:06

要获取 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/

这假设 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;

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

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

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
<h1 id='myTime'></h1>

这是个好方法
2021-03-20 15:37:06
toLocaleTimeString 的第一个参数是文化。它曾经是空的,但我现在已将答案更新为“en-US”,因为该问题专门要求 AM/PM。这显然会破坏本地化,但应该可以解决您的问题。你来自哪个国家 ?如果你跑步,你会看到什么navigator.language
2021-03-23 15:37:06
我正在使用此代码,但在我的国家/地区它没有显示 AM/PM。它将显示 CH 替换。如何解决这个问题?
2021-04-04 15:37:06
+1。我确实希望更快乐,活得更久!具体来说,是什么导致秒块在输出时被抑制?是因为seconds属性未定义吗?
2021-04-09 15:37:06
对。如果你不指定任何东西,一切都会出来。一旦你开始指定,你只会得到你所要求的。祝您长寿快乐!
2021-04-10 15:37:06

基于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/

简短的 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}`;
}