1

我正在尝试获取增量为 15 分钟的时间序列列表。

例如:

5:00 AM

5:15 AM

5:30 AM

....
...
.....

11:30 PM
4

2 回答 2

5

使用 Groovy TimeCategory,您可以很容易地进行时间操作(例如在日期上添加分钟数)。一个可运行的例子:

import groovy.time.TimeCategory

def start = Date.parseToStringDate('Sun Feb 24 05:00:00 GMT 2013')

use (TimeCategory) {
    // An array of 10 Dates separated by a 15 minute time interval from 'start'.
    def timeSeries = (0..9).collect { start + (it * 15).minutes }

    // Formatted output.
    println timeSeries.collect { it.format('KK:mm a') }.join('\n')
}

输出(假设系统时区为 GMT):

05:00 AM
05:15 AM
05:30 AM
05:45 AM
06:00 AM
06:15 AM
06:30 AM
06:45 AM
07:00 AM
07:15 AM

更新

为了得到 astartenddate 之间的时间序列,一种类似于我们之前所做的函数式方法是:

import groovy.time.TimeCategory
import groovy.time.TimeDuration

def createTimeSeries(Date start, Date end, TimeDuration interval) {
    def step = interval.toMilliseconds() as int
    (start.time..end.time).step(step).collect { new Date(it) }
}

// Usage
use (TimeCategory) {
    def start = Date.parseToStringDate('Sun Feb 24 05:00:00 GMT 2013')
    def end = Date.parseToStringDate('Sun Feb 24 06:00:00 GMT 2013')
    def timeSeries = createTimeSeries(start, end, 15.minutes)

    assert timeSeries.size() == 5 // 5:00, 5:15, 5:30, 5:45 and 6:00
}

真的很希望 Range 对象及其step方法具有更多的多态性,因此timeSeries = createTimeSeries(start, end, 15.minutes)可以简单地替换为timeSeries = (start..end).step(15.minutes)(毕竟startand endareDates ,因此彼此之间是 Comparable ,并且15.minutes,这是一个 TimeDuration ,可以添加到它们);不需要该createTimeSeries功能:)

但是,不要使用此实现。由于某种原因,这种Range#step方法在这种情况下非常缓慢;在我的笔记本电脑上获得 1 天日期差之间的时间序列需要几秒钟,即使它们只有 97 个元素:S

这是一个更迫切但更快的解决方案:

def createTimeSeries(Date start, Date end, TimeDuration interval) {
    def timeSeries = []
    while (start <= end) {
        timeSeries << start
        start += interval
    }
    timeSeries
}

// Usage is the same.
于 2013-02-24T07:28:24.540 回答
0

例如:

Date start = ....
int periods = 26
int incrementMinutes = 15

return (1..periods).collect {
  new Date(start.time + TimeUnit.MINUTES.toMillis(it * incrementMinutes)
}
于 2013-02-24T06:57:03.203 回答