无限循环连接问题

时间:2015-03-04 02:18:33

标签: javascript jquery loops

我想将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/

2 个答案:

答案 0 :(得分:1)

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。

下一组括号是“条件表达式”,并根据A的值选择Pi

答案 1 :(得分:0)

在第一个循环中,

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

应该是:

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

该中间位是延续条件,并且在您的变体中,它仅在小时 小于12时继续,换句话说,从1到11(包括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);
}

注意到我已经用#34;正确的&#34;取代了错误的上午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>"));
}

虽然这会在中午/午夜恢复到我认为的错误行为。