无限循环串联问题

infinite loop concatenation issue

本文关键字:问题 无限循环      更新时间:2023-09-26

我想在select标记中插入12AM到11PM,但在我的循环中缺少两件事,12AM和12PM。

            for (i = 1; i < 12; i++) {
                var am = '<option>' + i + ':00 AM</option>';
                $('#time').append(am);
            }
            for (i = 1; i < 12; i++) {
                var pm = '<option>' + i + ':00 PM</option>';
                $('#time').append(pm);
            }

http://jsfiddle.net/mzswo9xt/

function convert24HourTo12Hour(h) {
   return (h + 11) % 12 + 1;
}
for (i = 0; i < 24; i++) {
   $('#time').append(
      '<option>' + convert24HourTo12Hour(i) + ':00 ' + (i < 12 ? 'A' : 'P') + 'M</option>'
   );
}

(i + 11) % 12 + 1部分将0转换为12,将13-23转换为1-11。

下一组括号是一个"条件表达式",根据i的值选择AP

在第一个循环中,

for (i = 1; i < 12; i++) {

应该是:

for (i = 1; i <= 12; i++) {

中间位是连续条件,在您的变体中,它只在小时小于12时继续,换句话说,包括1到11。


如果你真的想把午夜作为第一个入口,你必须特别对待它,比如:

var opt = '<option>12:00 midnight</option>';
$('#time').append(opt);
for (i = 1; i < 12; i++) {
    opt = '<option>' + i + ':00 AM</option>';
    $('#time').append(opt);
}
opt = '<option>12:00 noon</option>';
$('#time').append(opt);
for (i = 1; i < 12; i++) {
    opt = '<option>' + i + ':00 PM</option>';
    $('#time').append(opt);
}

注意到我已经用"正确"的名称取代了错误的上午12点/下午12点-你可能不同意这种立场,但我认为这更可取。如果您想使用原来的名称,只需更改文本即可。

您可能还想考虑较短的:

$('#time').append('<option>12:00 midnight</option>');
for (i = 1; i < 12; i++) {
    $('#time').append('<option>' + i + ':00 AM</option>');
}
$('#time').append('<option>12:00 noon</option>');
for (i = 1; i < 12; i++) {
    $('#time').append('<option>' + i + ':00 PM</option>');
}

因为除了设置内容之外,您实际上不需要来保留opt


如果你要在某些方面(如日期和时间)做很多工作,那么找到一些让你的生活更轻松的东西可能是值得的,比如moment.js。这将大大简化在日期和时间上花费的精力。通常,都带有格式,因此您可以简单地使用以下内容:

for (var i = 0; i < 24; i++) {
    var m = new moment(new Date(2015,0,1,i,0,0));
    $('#time').append(m.format("<option>h:00 A</option>"));
}

尽管这又回到了我所认为的中午/午夜的错误行为。