我正在尝试获得一个时间序列列表,增量为15分钟.
例如:
5:00 AM
5:15 AM
5:30 AM
....
...
.....
11:30 PM
Run Code Online (Sandbox Code Playgroud)
使用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 start和enddate 之间的时间序列,一种类似于我们之前所做的功能性方法将是:
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)(毕竟start和endareDates,因此彼此之间可比较,并且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)
| 归档时间: |
|
| 查看次数: |
855 次 |
| 最近记录: |