【问题标题】:Create array of dates and minutes with JavaScript使用 JavaScript 创建日期和分钟数组
【发布时间】:2017-07-28 15:56:22
【问题描述】:

如何创建格式为 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 并不重要,但我想它更容易。

【问题讨论】:

    标签: javascript arrays date momentjs


    【解决方案1】:

    由于这些可以是通用功能,因此您应该将它们设置为可配置的。

    时间数组

    对于时间数组,我想创建时刻对象并操纵它的值会浪费资源。你可以用普通的循环来做到这一点。

    非即时版本

    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))

    日期数组

    由于您希望两个日期之间的日期具有特定间隔,因此最好将它们设置为可配置:

    时刻版

    我什至在这个版本中配置了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")
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"&gt;&lt;/script&gt;

    非 Moment 版本

    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);
    }

    【讨论】:

    • 我喜欢没有时刻的简单实现,但是如果我想将时钟转换为下午/上午,从一开始就用时刻来实现它会不会更有意义,所以我可以轻松地以不同的方式格式化它吗?
    • 在这种情况下,您只需执行var _tmp = Math.floor(h/12) ? "p.m." : "a.m" 并将h%12 传递给formatTime 函数并添加_tmp 以返回值
    • @Jamgreen 请检查更新。我也为此添加了一个标志
    【解决方案2】:

    您当前的实现思路没有问题(除了当前代码会导致无限循环。上限应单独声明),但由于 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]);
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"&gt;&lt;/script&gt;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-07
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多