import groovy.time.*
// groovy time!
import org.codehaus.groovy.runtime.TimeCategory
approxStartDate = new Date()
// возможная дата начала
approxEndDate = new Date() + 2
// возможная дата конца (импользуем +!)
startHour = 10
//начальный час. число произвольное
endHour = 20
//конечный час. число произвольное
stepsPerHour = 4
//разбивка часа, т.е. событие длится 15 минут. число произвольное
int duration = 7 * 15
//длительность. число произвольное
for(day in approxStartDate..approxEndDate) {
println " $day"
for(hour in startHour..<endHour) {
println " $hour"
for(step in 0..<stepsPerHour) {
use(TimeCategory) {
def dateTimeStart = new Date(
year: day.year,
month: day.month,
hours: hour,
minutes: step * 15,
seconds: 0)
def dateTimeEnd = dateTimeStart + duration.minutes
//прибавляем длительность чтобы получить конечную дату. просто и разумно.
println " $step : $dateTimeStart, $dateTimeEnd"
}
}
}
}
Простой, понятный и короткий код. И это хорошо.
Магия groovy работы с датами проявляется в 2-х местах.
Первое:
approxEndDate = new Date() + 2
В груви для даты опеределна функция plus(), поэтому к дате можно спокойно добавить дни. Самое смешно, что функция minus() для даты не определена, так что вычитать из даты таким образом нельзя.
Второе:
use(TimeCategory) {
def dateTimeStart = new Date(
year: day.year,
month: day.month,
hours: hour,
minutes: step * 15,
seconds: 0)
def dateTimeEnd = dateTimeStart + duration.minutes
//прибавляем длительность чтобы получить конечную дату. просто и разумно.
println " $step : $dateTimeStart, $dateTimeEnd"
Здесь используются классы TimeCategory и Duration. Первый позволяет записать Duration в виду duration.minutes, а Duration ползволяет прибавлять и вычитать из даты произвольные периоды времени.
Кстати вместо duration.minutes можно было бы записать 15.minutes или 2.hours, таким образом в этом небольшом куске кода используется DSL для работы с единицами измерения времени.
Такие дела.
Комментариев нет:
Отправить комментарий