【问题标题】:break times into 30 minute chunks将时间分成 30 分钟的小块
【发布时间】:2016-05-05 08:48:19
【问题描述】:

我有两个日期开始和结束

"start" : "Wed Jan 27 2016 21:00:00 GMT-0500",
"end" : "Thu Jan 27 2016 23:30:00 GMT-0500"

我想把这段时间分成following这样的块

"start" : "Wed Jan 27 2016 21:00:00 GMT-0500",
"end" : "Thu Jan 27 2016 21:30:00 GMT-0500"
----------------------------------------------
"start" : "Wed Jan 27 2016 21:30:00 GMT-0500",
"end" : "Thu Jan 27 2016 22:00:00 GMT-0500"
----------------------------------------------
"start" : "Wed Jan 27 2016 22:00:00 GMT-0500",
"end" : "Thu Jan 27 2016 22:30:00 GMT-0500"
----------------------------------------------
"start" : "Wed Jan 27 2016 22:30:00 GMT-0500",
"end" : "Thu Jan 27 2016 23:00:00 GMT-0500"
----------------------------------------------
"start" : "Wed Jan 27 2016 23:00:00 GMT-0500",
"end" : "Thu Jan 27 2016 23:30:00 GMT-0500"

有没有办法使用 moment.js 或 javascript 来做到这一点?

【问题讨论】:

  • 好吧,严格来说不是不知道时区,因为在间隔中间可能会有时间偏移变化。
  • @JoachimIsaksson,我知道日期来自的时区,假设是America/New_Your,如果我知道时区,有什么办法吗?
  • @JoachimIsaksson 和我也添加了时刻时区库
  • 那么您是否在想出一个算法来做到这一点,或者在 JS 中实现您的算法时遇到了麻烦?你被困在哪里了?请显示您现有代码的相关部分。
  • @nnnnnn,我不知道该怎么做,我搜索了一段时间并没有找到任何答案。所以从你的问题来看,这就是我被卡住的地方“我在想出一个算法时遇到了麻烦”

标签: javascript date datetime momentjs


【解决方案1】:
var startTime = new Date(start).getTime();
var endTime = new Date(end).getTime();

var duration = 1000 * 60 * 30;
var times = [] ;
var arr_len = (startTime - endTime)/duration;

for(i=0; i< arr_len; i++){
    times.push(new Date(startTime + duration));
}

然后你得到这些块

【讨论】:

  • 感谢您的回答,但是这里的开始和结束时间不是静态的,那么我们如何在这里找到块的数量呢?
  • @Sasikanth 你是什么意思开始和结束时间不是静态的?我附上了一张我在控制台中运行这些代码的图片。
  • 我的意思是,我们如何决定5 的号码,如果我有时间从1am to 5am 那里得到时间,那么我只会得到前 5 个 30 分钟的垃圾,但在这种情况下,我想要8个垃圾
  • 我误解了你的问题...请参阅新版本。
【解决方案2】:

我们可以像这样把时间分成几块:

 var time = {
   "start": "Wed Jan 27 2016 21:00:00 GMT-0500",
   "end": "Thu Jan 27 2016 23:30:00 GMT-0500"
 };


 var startTime = new Date(time.start).getTime();
 var endTime = new Date(time.end).getTime();

 var diff = endTime - startTime;

 var chunks = [];
 var hold = startTime;
 var threshold = (60 * 30 * 1000); //30minutes
 for (var i = (startTime + threshold); i <= endTime; i += (threshold)) {
   var newEndTime = new Date(i);
   chunks.push({
     start: new Date(hold),
     end: newEndTime
   });
   hold = newEndTime;
 }
 console.log(chunks)

【讨论】:

    【解决方案3】:

    使用moment-timezone(假设您added the timezone),这会将您的时间间隔写入console.log;

    var start = moment.tz('2016-01-27 21:00', 'America/New_York');
    var end   = moment.tz('2016-01-27 23:30', 'America/New_York');
    
    while(start < end) {
      console.log('Start: ' + start.format());
      start = start.add(30, 'minutes')
      console.log('End:   ' + start.format());
      console.log();
    }
    
    Start: 2016-01-27T21:00:00-05:00
    End:   2016-01-27T21:30:00-05:00
    
    Start: 2016-01-27T21:30:00-05:00
    End:   2016-01-27T22:00:00-05:00
    
    Start: 2016-01-27T22:00:00-05:00
    End:   2016-01-27T22:30:00-05:00
    
    Start: 2016-01-27T22:30:00-05:00
    End:   2016-01-27T23:00:00-05:00
    
    Start: 2016-01-27T23:00:00-05:00
    End:   2016-01-27T23:30:00-05:00
    

    【讨论】:

    • 如果我用 UTC 保存时间,那么我不需要做任何这些转换,对吧?
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2011-10-27
    • 2016-03-24
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多