如何在Groovy中增加一系列时间范围

bir*_*rdy 1 groovy

我正在尝试获得一个时间序列列表,增量为15分钟.

例如:

5:00 AM

5:15 AM

5:30 AM

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

11:30 PM
Run Code Online (Sandbox Code Playgroud)

epi*_*ian 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')
}
Run Code Online (Sandbox Code Playgroud)

输出(假设系统时区为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
Run Code Online (Sandbox Code Playgroud)

更新

要获得a startenddate 之间的时间序列,一种类似于我们之前所做的功能性方法将是:

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
}
Run Code Online (Sandbox Code Playgroud)

真的希望Range对象及其step方法更具多态性,因此timeSeries = createTimeSeries(start, end, 15.minutes)可以简单地替换timeSeries = (start..end).step(15.minutes)(毕竟startendareDates,因此彼此之间可比较,并且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.
Run Code Online (Sandbox Code Playgroud)