JavaScript中将am/pm时间转换为24小时制的简单方法是什么?

4

我一直在使用jQuery,但遇到了时间问题。我有三个时间输入选择框,一个用于小时,一个用于分钟,一个用于上午/下午标识。我需要将这个时间转换为24小时的字符串格式,然后将其放入隐藏输入框中。

var time = "";
time += $("#EventCloseTimeHour option:selected").text();
time += ":" + $("#EventCloseTimeMin option:selected").text() + ":00";
time += " " + $("#EventCloseTimeMeridian option:selected").text();

$("#ConditionValue").val(time);         

这里给出的是"1:30:00 pm",但我需要的是"13:30:00"。你有什么快速的javascript时间技巧吗?

我必须补充一点,最近我发现了datejs,它非常棒 - 你应该考虑是否想为单个问题(如上所述)包含整个日期库,但我做很多日期计算,所以它非常有用。http://www.datejs.com/ - reconbot
5个回答

8

tj111建议示例:

$("#ConditionValue").val(
    (
        new Date(
            "01/01/2000 " + 
            $("#EventCloseTimeHour option:selected").text() +
            $("#EventCloseTimeMin option:selected").text() + ":00" +
            " " +
            $("#EventCloseTimeMeridian option:selected").text()
        )
    ).toTimeString().slice(0,8))
;

或者你可以使用:

hour = hour %12 + (meridian === "AM"? 0 : 12);
hour = hour < 10 ? "0" + hour : hour;  

到目前为止,我最喜欢你的答案,但是当我使用“toTimeString”时得到了无效日期并且它被分割成了“Invalid”。这是在Firefox和Firebug中,但在Chrome中也不起作用。我认为日期对象不包括子午线。 - reconbot
检查是否从jQuery获取了正确的值... 如果输入无效,则会得到无效的输出。 - some
@some,请不要建议使用内置解析器进行解析,它依赖于实现且容易出错,参见为什么Date.parse会给出错误的结果? 此外,toTimeString 也依赖于实现,可能无法返回所需的值。 - RobG
当然,@RobG。你知道我在哪里可以找到一个通量电容器给我的时间机器,这样我就可以回到2009年2月了吗? - some
@RobG,我知道有这个功能,但是...这个问题几乎在8.5年前就被问过了,直到一个机器人在一个月前更新了链接从http到https之前没有任何活动。我将这个答案设为社区wiki,因为它只是tj111建议的方法的一个例子。我还展示了如何在不使用日期对象的情况下计算小时数。既然已经被接受,那么提问者应该是满意的。如果你对此有疑虑,请随意更新这个答案。 :-) - some

1

1
尝试使用Date.parse("01/01/2001 12:00 PM");(时间和AM / PM之间需要有一个空格,日期必须按照所示格式) - some
@some,请不要建议使用内置解析器进行解析,它依赖于具体实现且非常容易出错,详见为什么Date.parse会给出错误的结果? - RobG
这不是一个答案,应该是一条评论。 - RobG
@RobG 您是正确的,当使用当前的Stackoverflow标准时,这将更好地作为评论。但是该网站在8.5年前是不同的。 tj111当时可能也没有足够的声望来发表评论。 - some
虽然我在回答方面不太活跃,但我仍然经常来到这里。那是在 SO 的 alpha 或 beta 阶段,标准当时有些不同。我同意它不符合现代答案的标准。 - TJ L
显示剩余4条评论

1
var time = "";
var hour = Number($("#EventCloseTimeHour option:selected").text())%12 + ($("#EventCloseTimeMeridian option:selected").text() == 'PM'?12:0)) ;


time +=("00"+String(hour)).slice(-2)+":"+ $("#EventCloseTimeMin option:selected").text();

这个解决方案的关键是使用条件运算符"a?b:c",它的意思是"如果a成立,则执行b,否则执行c"。

仍然无法处理12:xx AM。您必须始终使用12对时间进行模运算,如果是PM,则再加上12。 - some

0

补充一个纯JS答案,以下代码将根据初始字符串的长度格式化时间。如果h:mm返回HH:mm,如果h:mm:ss返回HH:mm:ss。

如果始终需要HH:mm:ss,则可以在初始字符串中不存在时添加默认秒数“:00”,这很简单。

// Change time in h:mm:ss ap to  HH:mm:ss time
// If time missing seconds, returns HH:mm
function timeToHHmm(time) {
  var nums = time.match(/\d+/g);
  var am   = /am/i.test(time);
  nums[0] = ('0' + ((nums[0]%12) + (am? 0 : 12))).slice(-2);
  // If HH:mm:ss required, use following line instead of last
  // return nums.join(':') + (nums.length == 2? ':00' : '');
  return nums.join(':');
}

// Some tests
['2:45am',     // hh:mm only
 '5:15:45pm',  // hh:mm:ss
 '5:15:45 pm', // space before am/pm
 '05:15:45 pm',// leading zero on hour
 '12:02am',
 '12:02 pm',
 '12:02:00am'
 ].forEach(function(time) {
  console.log(time + ' => ' + timeToHHmm(time));
});


0

我通过几个人的答案得到了它。

var time = "";
var hour = Number($("#EventCloseTimeHour option:selected").text());
if($("#EventCloseTimeMeridian option:selected").text() == 'PM'){
    hour = String((hour%12) + 12);
}
hour = hour < 10 ? "0" + hour : hour;
time +=hour+":"+ $("#EventCloseTimeMin option:selected").text() + ":00";

小于10的小时应该用零填充。在24小时制中,始终有两个数字。 - some

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