我正在尝试获取增量为 15 分钟的时间序列列表。
例如:
5:00 AM
5:15 AM
5:30 AM
....
...
.....
11:30 PM
使用 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
更新
为了得到 astart
和end
date 之间的时间序列,一种类似于我们之前所做的函数式方法是:
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)
(毕竟start
and end
areDates ,因此彼此之间是 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.
例如:
Date start = ....
int periods = 26
int incrementMinutes = 15
return (1..periods).collect {
new Date(start.time + TimeUnit.MINUTES.toMillis(it * incrementMinutes)
}