在javascript中将军事时间转换为标准时间的最佳方法

时间:2015-03-23 09:07:42

标签: javascript

将军事时间转换为上午和下午时间的最佳方式是什么? 。 我有以下代码,它工作正常:

$scope.convertTimeAMPM = function(time){
//var time = "12:23:39";
var time = time.split(':');
var hours = time[0];
var minutes = time[1];
var seconds = time[2];
$scope.timeValue = "" + ((hours >12) ? hours -12 :hours);
    $scope.timeValue += (minutes < 10) ? ":0" : ":" + minutes;
    $scope.timeValue += (seconds < 10) ? ":0" : ":" + seconds;
    $scope.timeValue += (hours >= 12) ? " P.M." : " A.M.";
    //console.log( timeValue);
}

但是当我运行程序时,我对输出节目不满意。 。

示例输出:

20:00:00   8:0:0 P.M.
08:00:00   08:0:0 A.M
16:00:00   4:30:0 P.M.

我想实现如下所示的输出:

20:00:00   8:00:00 P.M.
08:00:00   8:00:00 A.M
16:30:00   4:30:00 P.M.

那里有什么建议吗?感谢

6 个答案:

答案 0 :(得分:9)

您错过了在minutes < 10seconds < 10时连接字符串,因此您无法获得所需的结果。

使用Number()将字符串转换为数字并正确使用它,如下面的工作代码段所示:

编辑:在声明Number()hoursminutes时更新了代码以使用seconds

var time = "16:30:00"; // your input

time = time.split(':'); // convert to array

// fetch
var hours = Number(time[0]);
var minutes = Number(time[1]);
var seconds = Number(time[2]);

// calculate
var timeValue;

if (hours > 0 && hours <= 12) {
  timeValue= "" + hours;
} else if (hours > 12) {
  timeValue= "" + (hours - 12);
} else if (hours == 0) {
  timeValue= "12";
}
 
timeValue += (minutes < 10) ? ":0" + minutes : ":" + minutes;  // get minutes
timeValue += (seconds < 10) ? ":0" + seconds : ":" + seconds;  // get seconds
timeValue += (hours >= 12) ? " P.M." : " A.M.";  // get AM/PM

// show
alert(timeValue);
console.log(timeValue);

阅读:Number() | MDN

答案 1 :(得分:7)

正如Nit推荐的那样,Moment.js为您的问题提供了一个简单的解决方案。

&#13;
&#13;
function convert(input) {
    return moment(input, 'HH:mm:ss').format('h:mm:ss A');
}

console.log(convert('20:00:00'));
console.log(convert('08:00:00'));
console.log(convert('16:30:00'));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

不需要图书馆

这是一个甜蜜的&amp;简单的功能我发誓应该完全符合你的需要

function toStandardTime(militaryTime) {
    militaryTime = militaryTime.split(':');
    return (militaryTime[0].charAt(0) == 1 && militaryTime[0].charAt(1) > 2) ? (militaryTime[0] - 12) + ':' + militaryTime[1] + ':' + militaryTime[2] + ' P.M.' : militaryTime.join(':') + ' A.M.'
}

console.log(toStandardTime('16:30:00'));

如果需要,还有一个更易阅读的版本

function toStandardTime(militaryTime) {
  militaryTime = militaryTime.split(':');
  if (militaryTime[0].charAt(0) == 1 && militaryTime[0].charAt(1) > 2) {
    return (militaryTime[0] - 12) + ':' + militaryTime[1] + ':' + militaryTime[2] + ' P.M.';
  } else {
    return militaryTime.join(':') + ' A.M.';
  }
}

console.log(toStandardTime('16:30:00'));

答案 3 :(得分:0)

使用ES6的紧凑方法如下:

$query = DB::table('mgl_report_targets')
->select('id', 'month', 'meeting_start_date', 'call_start_date')
->whereRaw("extract(month from to_date(mgl_report_targets.month, '%Month-%YYYY')) in (extract(month from meeting_start_date), extract(month from call_start_date))");

$results = $query->get();

$sql = $query->toSql();

答案 4 :(得分:0)

const parseMillitaryTime = (time: string) =>
    pipe(
      time,
      s => s.split(':'),
      time_ =>
        `${((Number(time_[0]) + 11) % 12) + 1}:${
          Number(time_[1]) < 10 ? `0${Number(time_[1])}` : `${Number(time_[1])}`
        } ${Number(time_[0]) > 11 ? 'pm' : 'am'}`
    )

答案 5 :(得分:0)

作为 Huy Hoang Pham 回答的扩展,这里是使用 Luxon 而不是 moment.js 的代码(参见 thisthis

import { DateTime }  from "luxon";

function convert(input) {
    return DateTime.fromFormat(input, 'HH:mm:ss').toFormat('h:mm:ss A');
}

console.log(convert('20:00:00'));
console.log(convert('08:00:00'));
console.log(convert('16:30:00'));

时间很复杂,我建议在您自己的代码上使用库来进行这样的转换。