使用JavaScript创建日期和分钟数组

时间:2017-03-08 07:24:06

标签: javascript arrays date momentjs

如何从今天开始创建格式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并不重要,但我想这更容易。

2 个答案:

答案 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>

当然,如果某些范围(例如从现在开始的月份)重复出现,则可以将它们放在一个单独的函数中,该函数调用范围函数。