在 JavaScript 中每 X 分钟生成一次时间数组(作为字符串)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36125038/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Generate array of times (as strings) for every X minutes in JavaScript
提问by Brett DeWoody
I'm trying to create an array of times (strings, not Date
objects) for every X minutes throughout a full 24 hours. For example, for a 5 minute interval the array would be:
我试图Date
在整整 24 小时内每 X 分钟创建一个时间数组(字符串,而不是对象)。例如,对于 5 分钟的间隔,数组将是:
['12:00 AM', '12:05 AM', '12:10 AM', '12:15 AM', ..., '11:55 PM']
My quick and dirty solution was to use 3 nested for
loops:
我快速而肮脏的解决方案是使用 3 个嵌套for
循环:
var times = []
, periods = ['AM', 'PM']
, hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
, prop = null
, hour = null
, min = null;
for (prop in periods) {
for (hour in hours) {
for (min = 0; min < 60; min += 5) {
times.push(('0' + hours[hour]).slice(-2) + ':' + ('0' + min).slice(-2) + " " + periods[prop]);
}
}
}
This outputs the desired result but I'm wondering if there's a more elegant solution. Is there a way to do this that's:
这会输出所需的结果,但我想知道是否有更优雅的解决方案。有没有办法做到这一点:
- more readable
- less time complex
- 更具可读性
- 时间复杂度较低
回答by Harpreet
If the interval is only to be set in minutes[0-60], then evaluate the below solution w/o creating the date object and in single loop:
如果间隔仅以分钟 [0-60] 为单位设置,则在不创建日期对象和单循环的情况下评估以下解决方案:
var x = 5; //minutes interval
var times = []; // time array
var tt = 0; // start time
var ap = ['AM', 'PM']; // AM-PM
//loop to increment the time and push results in array
for (var i=0;tt<24*60; i++) {
var hh = Math.floor(tt/60); // getting hours of day in 0-24 format
var mm = (tt%60); // getting minutes of the hour in 0-55 format
times[i] = ("0" + (hh % 12)).slice(-2) + ':' + ("0" + mm).slice(-2) + ap[Math.floor(hh/12)]; // pushing data in array in [00:00 - 12:00 AM/PM format]
tt = tt + x;
}
console.log(times);
回答by RamblinRose
Allocating the resulting array to avoid the overhead of push, parameter validation and locale specifics notwithstanding:
分配结果数组以避免推送、参数验证和区域设置细节的开销,尽管:
function generate_series(step) {
const dt = new Date(1970, 0, 1);
const rc = [];
while (dt.getDate() === 1) {
rc.push(dt.toLocaleTimeString('en-US'));
dt.setMinutes(dt.getMinutes() + step);
}
return rc;
}
Here's a demo snippet.
这是一个演示片段。
function generate_series(step) {
const dt = new Date(1970, 0, 1);
const rc = [];
while (dt.getDate() === 1) {
rc.push(dt.toLocaleTimeString('en-US'));
dt.setMinutes(dt.getMinutes() + step);
}
return rc;
}
function on_generate_series(step) {
const dt = new Date(1970, 0, 1);
const el = document.getElementById("series")
while (el.firstChild)
el.removeChild(el.firstChild);
const series = generate_series(step);
while (series.length > 0) {
let item = document.createElement("div");
item.innerText = series.shift();
el.appendChild(item);
}
}
<h1 id="title">24 Hour Minute Series</h1>
<input type="number" id="step" value="30" />
<input type="submit" id="byBtn" value="Generate Series" onclick="on_generate_series(parseInt(document.getElementById('step').value,10))" />
<div id="series">
</div>
回答by GollyJer
The following is massively flexible with the help of Moment.js.
在Moment.js的帮助下,以下内容非常灵活。
This code uses
此代码使用
There's no error handling, so you can pass in stupid parameters, but it gets the point across. :-D
没有错误处理,所以你可以传递愚蠢的参数,但它得到了重点。:-D
The desiredStartTime
parameter takes a time in hh:mm
format.
该desiredStartTime
参数需要一段时间的hh:mm
格式。
The period
parameter accepts any of the moment.duration
inputs.
该period
参数接受任何moment.duration
输入。
const timelineLabels = (desiredStartTime, interval, period) => {
const periodsInADay = moment.duration(1, 'day').as(period);
const timeLabels = [];
const startTimeMoment = moment(desiredStartTime, 'hh:mm');
for (let i = 0; i <= periodsInADay; i += interval) {
startTimeMoment.add(i === 0 ? 0 : interval, period);
timeLabels.push(startTimeMoment.format('hh:mm A'));
}
return timeLabels;
};
/* A few examples */
const theDiv = document.getElementById("times");
let content;
content = JSON.stringify(timelineLabels('18:00', 2, 'hours'))
theDiv.appendChild(document.createTextNode(content));
theDiv.appendChild(document.createElement("p"));
content = JSON.stringify(timelineLabels('06:00', 30, 'm'))
theDiv.appendChild(document.createTextNode(content));
theDiv.appendChild(document.createElement("p"));
content = JSON.stringify(timelineLabels('00:00', 5, 'minutes'))
theDiv.appendChild(document.createTextNode(content));
theDiv.appendChild(document.createElement("p"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
<div id="times"></div>
回答by Jonathon Hibbard
if you have access to moment
, you can always do something like this:
如果您有权访问moment
,您可以随时执行以下操作:
const locale = 'en'; // or whatever you want...
const hours = [];
moment.locale(locale); // optional - can remove if you are only dealing with one locale
for(let hour = 0; hour < 24; hour++) {
hours.push(moment({ hour }).format('h:mm A'));
hours.push(
moment({
hour,
minute: 30
}).format('h:mm A')
);
}
the result is the following array:
结果是以下数组:
["12:00 AM", "12:30 AM", "1:00 AM", "1:30 AM", "2:00 AM", "2:30 AM", "3:00 AM", "3:30 AM", "4:00 AM", "4:30 AM", "5:00 AM", "5:30 AM", "6:00 AM", "6:30 AM", "7:00 AM", "7:30 AM", "8:00 AM", "8:30 AM", "9:00 AM", "9:30 AM", "10:00 AM", "10:30 AM", "11:00 AM", "11:30 AM", "12:00 PM", "12:30 PM", "1:00 PM", "1:30 PM", "2:00 PM", "2:30 PM", "3:00 PM", "3:30 PM", "4:00 PM", "4:30 PM", "5:00 PM", "5:30 PM", "6:00 PM", "6:30 PM", "7:00 PM", "7:30 PM", "8:00 PM", "8:30 PM", "9:00 PM", "9:30 PM", "10:00 PM", "10:30 PM", "11:00 PM", "11:30 PM"]
回答by gurvinder372
You need only one loop, follow this approach
你只需要一个循环,按照这个方法
var d = new Date(); //get a date object
d.setHours(0,0,0,0); //reassign it to today's midnight
Now keep adding 5 minutes till the d.getDate()
value changes
现在继续增加 5 分钟,直到d.getDate()
值发生变化
var date = d.getDate();
var timeArr = [];
while ( date == d.getDate() )
{
var hours = d.getHours();
var minutes = d.getMinutes();
hours = hours == 0 ? 12: hours; //if it is 0, then make it 12
var ampm = "am";
ampm = hours > 12 ? "pm": "am";
hours = hours > 12 ? hours - 12: hours; //if more than 12, reduce 12 and set am/pm flag
hours = ( "0" + hours ).slice(-2); //pad with 0
minute = ( "0" + d.getMinutes() ).slice(-2); //pad with 0
timeArr.push( hours + ":" + minute + " " + ampm );
d.setMinutes( d.getMinutes() + 5); //increment by 5 minutes
}
回答by Lewis
Loops are unnecessary in this case.
在这种情况下不需要循环。
ES6
ES6
//Array.from, only supported by Chrome 45+, Firefox 32+, Edge and Safari 9.0+
//create an array of the expected interval
let arr = Array.from({
length: 24 * 60 / 5
}, (v, i) => {
let h = Math.floor(i * 5 / 60);
let m = i * 5 - h * 60;
//convert to 12 hours time
//pad zero to minute
if (m < 10) {
m = '0' + m;
}
let label = 'AM';
if (h > 12) {
label = 'PM';
h -= 12;
}
if (h === 0) {
h = 12;
}
return h + ':' + m + ' ' + label;
});
document.body.textContent = JSON.stringify(arr);
Wider browser support
更广泛的浏览器支持
var arr = Array.apply(null, {
length: 24 * 60 / 5
}).map(function(v, i) {
var h = Math.floor(i * 5 / 60);
var m = i * 5 - h * 60;
if (m < 10) {
m = '0' + m;
}
var label = 'AM';
if (h > 12) {
label = 'PM';
h -= 12;
}
if (h === 0) {
h = 12;
}
return h + ':' + m + ' ' + label;
});
document.body.textContent = JSON.stringify(arr);
回答by Mikhail Tulubaev
In any case you need to do O(N) operations to enumerate array elements.
However, you could iterate through Date
objects itself.
在任何情况下,您都需要执行 O(N) 操作来枚举数组元素。但是,您可以遍历Date
对象本身。
function timeArr(interval) //required function with custom MINUTES interval
{
var result = [];
var start = new Date(1,1,1,0,0);
var end = new Date(1,1,2,0,0);
for (var d = start; d < end; d.setMinutes(d.getMinutes() + 5)) {
result.push(format(d));
}
return result;
}
function format(inputDate) // auxiliary function to format Date object
{
var hours = inputDate.getHours();
var minutes = inputDate.getMinutes();
var ampm = hours < 12? "AM" : (hours=hours%12,"PM");
hours = hours == 0? 12 : hours < 10? ("0" + hours) : hours;
minutes = minutes < 10 ? ("0" + minutes) : minutes;
return hours + ":" + minutes + " " + ampm;
}
回答by Pawe? Adamski
My solution with emphasize on readability. It first creates objects that represent correct times and then formats them to strings. JsFiddle https://jsfiddle.net/6qk60hxs/
我的解决方案强调可读性。它首先创建表示正确时间的对象,然后将它们格式化为字符串。JsFiddle https://jsfiddle.net/6qk60hxs/
var periods = ['AM', 'PM'];
var hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
var minutes = ["00", "05", 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
timeObj = add([{}], "p", periods);
timeObj = add(timeObj, "h", hours);
timeObj = add(timeObj, "m", minutes);
times = []
for (t of timeObj) {
times.push(t.h + ':' + t.m + ' ' + t.p);
}
console.log(times)
function add(tab, prop, val) {
var result = [];
for (t of tab) {
for (v of val) {
tc = _.clone(t);
tc[prop] = v;
result.push(tc);
}
}
return result
}
回答by guest271314
You could use a single for
loop, while
loop , Array.prototype.map()
, Array.prototype.concat()
, String.prototype.replace()
您可以使用单个for
循环、while
loop 、Array.prototype.map()
、Array.prototype.concat()
、String.prototype.replace()
var n = 0,
min = 5,
periods = [" AM", " PM"],
times = [],
hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
for (var i = 0; i < hours.length; i++) {
times.push(hours[i] + ":" + n + n + periods[0]);
while (n < 60 - min) {
times.push(hours[i] + ":" + ((n += 5) < 10 ? "O" + n : n) + periods[0])
}
n = 0;
}
times = times.concat(times.slice(0).map(function(time) {
return time.replace(periods[0], periods[1])
}));
console.log(times)
回答by Viktor Kireev
Manipulating with a date as with integer and using single loop:
将日期作为整数进行操作并使用单循环:
var interval = 5 * 60 * 1000; //5 minutes
var period = 24 * 60 * 60 * 1000; //dat period
//just converts any time to desired string
var toString = function toString(time){
var h = time.getHours();
var m = time.getMinutes();
var p = h >= 12 ? "PM" : "AM";
h = h || 12;
h = h > 12 ? h - 12 : h;
return ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2) + " " + p;
}
//start time
var time = new Date(2010, 0, 1);
//resulting array
var times = [];
for ( var t = +time; t < +time + period; t += interval){
var d = toString(new Date(t));
times.push(d);
}