如何从今天开始创建格式DD-MM-YYYY
的日期数组,提前1?
我猜它就像
var dates = [];
var date = moment();
while (date <= date.clone().add(1, 'month')) {
dates.push(date.format('DD-MM-YYYY'));
date = date.clone().add(1, 'd');
}
但这是最好的方法吗?
我怎么能在几分钟内做同样的事情?我想要一个['00:00', '00:05', '00:10', ..., '23:50', '23:55']
的数组。
我猜它就像
var minutes = [];
var time = moment('00:00', 'hh:mm');
while (time < time.clone().add(1, 'day')) {
minutes.push(time.format('hh:mm'));
time = time.clone().add(5, 'minutes');
}
使用moment.js并不重要,但我想这更容易。
答案 0 :(得分:2)
由于这些可以是一般功能,因此您应该将它们配置为可用。
对于Time数组,我想创建时刻对象并操纵它的值将浪费资源。你可以用正常循环来做到这一点。
非时刻版
function getDoubleDigits(str) {
return ("00" + str).slice(-2);
}
function formatTime(h, m, is24Hr) {
var tmp = "";
if(is24Hr){
tmp =" " + (Math.floor(h/12) ? "p.m." : "a.m.")
h=h%12;
}
return getDoubleDigits(h) + ":" + getDoubleDigits(m) + tmp;;
}
function getTimeByInterval(interval, is24HrFormat) {
var times = []
for (var i = 0; i < 24; i++) {
for (var j = 0; j < 60; j += interval) {
times.push(formatTime(i, j, is24HrFormat))
}
}
return times.slice(0);
}
console.log(getTimeByInterval(5, false))
console.log(getTimeByInterval(5, true))
由于您希望具有特定间隔的2个日期之间的日期,因此最好使它们可配置:
时刻版
我在这个版本中可以配置format
。这也可以在非片刻版本中完成,但我想(如何在纯JS 中格式化日期)不在问题的范围内,所以不这样做。
function getDatesInrange(d1, d2, interval, format){
var dates = [];
while(d1.isBefore(d2)){
dates.push(d1.format(format));
d1.add(interval, "days");
}
console.log(dates)
return dates.slice(0)
}
getDatesInrange(moment(), moment().add(1, "month"), 1, "DD-MM-YYYY")
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
非时刻版
function getDatesInrange(d1, d2, interval){
var dates = [];
while(+d1 < +d2){
dates.push(formateDate(d1));
d1.setDate(d1.getDate() + interval)
}
console.log(dates)
return dates.slice(0)
}
function formateDate(date){
return [getDoubleDigits(date.getDate()),
getDoubleDigits(date.getMonth() +1),
date.getFullYear()].join('-')
}
var startDate = new Date();
var endDate = new Date();
endDate.setMonth(endDate.getMonth() + 1);
getDatesInrange(startDate, endDate, 1)
function getDoubleDigits(str) {
return ("00" + str).slice(-2);
}
答案 1 :(得分:0)
你当前的实现思路没有错(除了当前代码会导致无限循环。天花板应该单独声明),但是因为moment.js可以持续持续对象,所以也可以创建一个单独的辅助函数其中计算值。对于某些情况,这可能不是最有效的方式(对于没有约会的时间,这可能是过度杀伤),但它会使它保持多样化。例如如果范围应保持不变,但只有格式应更改为包含日期,则只需更改一个参数。
以下示例使用ES6生成器,但可以轻松转换为返回数组:
function* createRange(start, duration, interval, format){
let dt= start.clone(), target = start.clone().add(duration);
while(dt < target){
yield dt.format(format);
dt.add(interval || {years:1});
}
}
let dates = createRange(moment(),{month:1}, {days:1}, 'DD-MM-YYYY'),
times= createRange(moment('00:00','HH:mm'),{days:1},{minutes:5}, 'HH:mm');
console.log([...dates]);
console.log([...times]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
当然,如果某些范围(例如从现在开始的月份)重复出现,则可以将它们放在一个单独的函数中,该函数调用范围函数。