繁体   English   中英

如何在javascript中创建一个小时和分钟的数组?

[英]How to create an array with hours and minutes in javascript?

我正在尝试创建一个时间数组,例如:

1:00
1:15
1:30
1:45
2:00
2:15
...

这是我的代码,它的作用是从当前时间开始计时:

var timeArray = [];
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();

for (var i = h; i <= 24; i++) {
   for (var j = m; j <= 59; j++) {
       if (j % 15 === 0) {
            j = j === 0 ? '00' : j;
            if (i >= 12) {
                timeArray.push((i - 12) + ':' + j + ' PM');
            } else {
                timeArray.push(i + ':' + j + ' AM');
            }
        }
    }
}

问题是m超过46 ,比如var m = 50; ,则数组变空,因为j % 15不再为 0。

一个想法如何解决这个问题?

谢谢

如果你想要的是一个数组 ["1:00", "1:15", ...] 那么为什么不直接构建它呢? 它与“小时”和“分钟”无关,只与“获得一些明显的连续数字”有关:

var arr = [], i, j;
for(i=0; i<24; i++) {
  for(j=0; j<4; j++) {
    arr.push(i + ":" + (j===0 ? "00" : 15*j) );
  }
}

完毕。 查找最接近 15 分钟时间段的当前时间:

var d = new Date(),
    h = d.getHours(),
    m = 15 * Math.floor(d.getMinutes()/15),
    stamp = h + ":" + (m === 0 ? "00" : m);

只需重新排序时间段:

var pos = arr.indexOf(stamp),
    timelist = arr.slice(pos).concat(arr.slice(0,pos));

我认为你可以通过使用 JavaScript Date API 和一个简单的技巧来更简单地做到这一点。

在循环中,您只需要添加 15 * 60 秒(四分之一小时)到时间戳并打印。 开始时只计算最接近的全职时间 (11:57 -> 12:00),然后根据需要添加尽可能多的季度。

请看代码:

var date, array = [];
date = new Date();

// Here we will find the closest time
// If it's 13:09 we'll iterate to 13:15 and stop
//
// We'll iterate fifteen times in the worst case scenario
while (date.getMinutes() % 15 !== 0) {
    date.setMinutes ( date.getMinutes() + 1 );
}

// A whole day has 24 * 4 quarters of an hour
// Let's iterate using for loop
for (var i = 0; i < 24 * 4; i++) {
    array.push(date.getHours() + ':' + date.getMinutes());
    date.setMinutes ( date.getMinutes() + 15);
}

console.log(array);

// Now in Poland it's 18:10 so the result is an array of 96 elements 
// ["18:15", "18:30", "18:45", "19:0", ... "17:30", "17:45", "18:0"]
// As you may noticed, there is a need to format date when it's a full hour.
// We have 18:0 but we expect 18:00. This will be more understandable for users.
// We can open another discussion to find the best way to do that ;)

尝试这个:

var timeArray = [],
    d = new Date(),
    h = d.getHours(),
    m = d.getMinutes(),
    meridiem = ['AM','PM'];
for (var i = h; i < 24; ++i) {
    for (var j = i==h ? Math.ceil(m/15) : 0; j < 4; ++j) {
        timeArray.push(i%12 + ':' + (j*15||'00') + ' ' + meridiem[i/12|0]);
    }
}

一个班轮:

 const arr = Array(24 * 4).fill(0).map((_, i) => { return ('0' + ~~(i / 4) + ': 0' + 60 * (i / 4 % 1)).replace(/\\d(\\d\\d)/g, '$1') });

我的解决方案有点冗长,但它也为您提供了在某些情况下可能有用的相关时间值。

 const getTimeBlocks = () => { const minutesInDay = 1440; const timeBlocksArr = [{ timeString: '12:00 AM', timeValue: '0' }]; for (let i = 30; i <= minutesInDay - 30; i += 30) { const halfHourInLoop = i / 60; let formattedBlock = String(halfHourInLoop); const hour = formattedBlock.split('.')[0]; const minute = i % 60 === 0 ? '00' : '30'; formattedBlock = `${hour}:${minute}`; const today = new Date(); const timeString = new Date( today.getFullYear(), today.getMonth(), today.getDate(), Number(hour), Number(minute), ); timeBlocksArr.push({ timeString: timeString.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }), timeValue: formattedBlock, }); } return timeBlocksArr; }; console.log(getTimeBlocks());

主要问题是内部循环 ( j ) 从m变量开始,并且在一天中的大部分时间可能不为零。 所以对于i的第一个循环是可以的。 但是对于下一个循环,您希望它为零。 您可以通过在i for 循环结束时将该m变量赋值为零来解决该问题。

并尽量不要将用于计算的变量(整数)与用于格式化时间的变量(字符串)混合在一起。 你在这里为j这样做:

j = j === 0 ? '00' : j;

这是我要使用的代码(我还将 AM 固定为午夜 12 点,并通过简单地增加 15 而不是增加 1 跳过了 j 的大部分迭代):

var timeArray = [];
var d = new Date();
var h = d.getHours();
var m = Math.ceil(d.getMinutes() / 15) * 15;

for (var i = h; i <= 24; i++) {
  for (var j = m; j <= 59; j += 15) {
    var mf = j === 0 ? '00' : j;
    var hf = i >= 12 ? (i - 12) : i;
    var amPm = i >= 12 && i < 24 ? 'PM' : 'AM';
    timeArray.push(hf + ':' + mf + ' ' +  amPm);
  }
  m = 0;
}

尝试这个

var timeArray = [];
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();

for(var i=0; i< 24; i++){
    for(m = (m + 15 - m%15)%60; m < 60; m = m + 15){
        timeArray.push(h + ':' + m);
    }
    h = (h+1) % 24;
    timeArray.push(h + ':' + '00');
}

console.log(timeArray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM