当 militaryHour 变量设置为 0 时,为什么系统打印 0 而不是我设置的小时(变量)是 12?



我正在尝试构建一个将军事时间转换为上午或下午时间的程序。

我预计 0 的输出是 12 am,但实际输出是 0 am。

const militaryHour = 0;

var hour = 0;
var amOrPm = "am";

if (militaryHour < 12) {
hour = militaryHour;
console.log(hour + " " + amOrPm);
} else if (militaryHour == 12) {
amOrPm = "pm";
hour = 12;
console.log(hour + " " + amOrPm);
} else if (militaryHour < 24) {
amOrPm = "pm";
hour = militaryHour - 12;
console.log(hour + " " + amOrPm);
} else if (militaryHour == 24){
hour = 12;
console.log(hour + " " + amOrPm);
} else {
hour = 12;
console.log(hour + " " + amOrPm);
}

您需要的所有代码

const militaryHour = 0,
hour = (militaryHour + 11) % 12 + 1,
amOrPm = militaryHour % 24 < 12 ? 'am' : 'pm';

不需要如果/否则需要

让我们按照你的逻辑

const militaryHour = 0; 

if (militaryHour < 12)

好的,肯定会进入这个 if 语句,因为 0<12

hour = militaryHour;
console.log(hour + " " + amOrPm);

然后记录任何军事小时,即 0。这就是您的代码打印"0 am"的原因

上午 12 点实际上是一个边缘情况。您只需要再添加一个条件

if (militaryHour==0) {
hour = 12;
console.log(hour+" "+amOrPm)
}

在你的代码中,第一个分支if (militaryHour < 12) {...}为真,所以我们有:

const militaryHour = 0;
var hour = 0;
var amOrPm = "am";
hour = militaryHour;
console.log(hour + " " + amOrPm);

很明显,我们将从中得到0。

这里有一个解决方案:以 24 小时制时间 mod 12 为例。如果我们以 0 结束,则使其成为 12。无论哪种方式,请附加 A.M./P.M.,具体取决于时间属于一天的哪半部分。所有这些都消除了容易出错的大型条件块。

const militaryToNormal = hour => 
(hour % 12 || 12) + (hour % 24 < 12 ? "am" : "pm")
;
for (let i = 0; i < 30; i++) {
console.log(i, "=>", militaryToNormal(i));
}

如果可以的话,更喜欢时刻.js。