如何解决如何在Javascript日期对象中格式化日期并设置它们之间的间隔?
我正在计划应用程序。要求是用户输入两个时间范围,应用程序应将其分为20个间隔,中间间隔10分钟。例如,如果我输入15:15-17:15,它应该给我一些广告位,例如:['15:15','15:35','15:45','16:55']。
我面临的错误:我正在使用的方法可以很好地设置时间间隔,但不能在两者之间留出10分钟的间隔。我的输出给出[“ 15:15”,“ 15:35”,“ 15:55”,“ 16:15”,“ 16:35”,“ 16:55”,“ 17:15”]。此外,如果我将结束时间输入为17:05,则结果仍将最终计数为17:15。
最后,如果以上两个问题都得到解决,那么如果有人可以告诉我如何格式化数组,使结果为:['15:15-15:35','15:45- 16:55']。 TIA
let date1 = new Date(2020,8,20,15,15);
let date2 = new Date(2020,17,05);
let slots = []
if(date1 < date2){
console.log((date2.getHours()*60 - date1.getHours()*60)/20)
for(var i = 0; date1 < date2; i=20)
{
date1.setMinutes(date1.getMinutes()+i)
slots.push(date1.getHours() + ':' + date1.getMinutes());
}
console.log(slots)
}
else{
console.log('End time should be greater than start time')
}
解决方法
这应该可以解决问题:
const dateToString = date => date.getHours() + ':' + (date.getMinutes() + '').padStart(2,'0')
const date1 = new Date(2020,8,20,15,15);
const date2 = new Date(2020,17,05);
function getIntervals(date1,date2) {
date1 = new Date(date1.getTime()) // so we don't mutate date1
const intervalLength = 20,breakLength = 10,intervals = []
let interval
while (date1 < date2) {
interval && intervals.push(interval)
interval = [intervalLength,breakLength].map(len => {
const str = dateToString(date1)
date1.setMinutes(date1.getMinutes() + len)
return str
}).join('-') // - separator
}
return intervals
}
console.log(getIntervals(date1,date2))
dateToString
将Date对象转换为hh:mm格式,如有必要,将分钟部分填充为零。要获取间隔,我们逐步改变intervalLength和breakLength的时间长度,并将每个生成的间隔推入数组。然后我们返回间隔。
OP中的代码似乎没有正确地划分时间,也没有考虑到句点之间的间隔。
两个日期之间的时间需要细分为 n 个时间段,并且之间必须间隔 n-1 10分钟。将一个日期与另一个日期相减会得出时间差(以毫秒为单位),然后需要将其划分为所需的时间段和间隔,例如
/**
* @param {Date} start - start date and time
* @param {Date} end - end date and time
* @param {number} periods - number of periods
* @param {number} interval - interval between periods in minutes
* @returns {Array} array of perids with interval gap between
* in format ['HH:mm - HH:mm',...]
*/
function getSlots(start,end,periods,interval) {
// Function to format period timestamp
function f(d) {
return ('' + d.getHours()).padStart(2,'0') + ':' + ('' + d.getMinutes()).padStart(2,'0');
}
let slots = [];
let diff = end - start;
if (diff < 0) return 'End must be after start';
// Get length of interval in ms
let intLength = interval * 6e4;
// Get total length of intervals in ms
let intTotal = (periods - 1) * intLength;
// Get length of each period in ms
let periodLength = (diff - intTotal) / periods;
// Generate periods
for (let e,s = new Date(start),i = periods; i > 0; i--) {
// Copy start to get end and add length of period
e = new Date(+s + periodLength);
// Write period to slots array
slots.push(f(s) + '-' + f(e));
// Increment s to start of next period
s.setMilliseconds(s.getMilliseconds() + periodLength + intLength);
}
return slots;
}
let date1 = new Date(2020,15);
let date2 = new Date(2020,5);
console.log(getSlots(date1,date2,2,10));
请注意,这完全填满了允许的时间,末尾没有间隔。而且,时间会被截断为整分钟,因此似乎没有完全相同的分钟数或相等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。