/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.time;
import java.util.
Calendar;
import java.util.
Date;
import java.util.
TimeZone;
/**
* Apply a number of methods to allow convenient Date/Time manipulation,such as:
* <pre class="groovyTestCase">
* use (groovy.time.TimeCategory) {
* // application on numbers:
* println 1.minute.from.now
* println 10.hours.ago
*
* // application on dates
* def someDate = new Date()
* println someDate - 3.months
* }
* </pre>
*
* @see BaseDuration
*/
public class
TimeCategory {
/*
* Methods to allow Date Duration arithmetic
*/
public static
Date plus(final
Date date, final
BaseDuration duration) {
return
duration.
plus(
date);
}
public static
Date minus(final
Date date, final
BaseDuration duration) {
final
Calendar cal =
Calendar.
getInstance();
cal.
setTime(
date);
cal.
add(
Calendar.
YEAR, -
duration.
getYears());
cal.
add(
Calendar.
MONTH, -
duration.
getMonths());
cal.
add(
Calendar.
DAY_OF_YEAR, -
duration.
getDays());
cal.
add(
Calendar.
HOUR_OF_DAY, -
duration.
getHours());
cal.
add(
Calendar.
MINUTE, -
duration.
getMinutes());
cal.
add(
Calendar.
SECOND, -
duration.
getSeconds());
cal.
add(
Calendar.
MILLISECOND, -
duration.
getMillis());
return
cal.
getTime();
}
/**
* Retrieves the default TimeZone for a date by using the default Locale
* settings. Recommended that you use {@code TimeZone.getDefault()} instead.
*
* @param self a Date
* @return the TimeZone
*/
@
Deprecated
public static
TimeZone getTimeZone(
Date self) {
Calendar calendar =
Calendar.
getInstance();
calendar.
setTime(
self);
return
calendar.
getTimeZone();
}
/**
* Get the DST offset (if any) for the default locale and the given date.
*
* @param self a Date
* @return the DST offset as a Duration.
*/
public static
Duration getDaylightSavingsOffset(
Date self) {
TimeZone timeZone =
getTimeZone(
self);
int
millis = (
timeZone.
useDaylightTime() &&
timeZone.
inDaylightTime(
self))
?
timeZone.
getDSTSavings() : 0;
return new
TimeDuration(0, 0, 0,
millis);
}
public static
Duration getDaylightSavingsOffset(
BaseDuration self) {
return
getDaylightSavingsOffset(new
Date(
self.
toMilliseconds() + 1));
}
/**
* Return a Duration representing the DST difference (if any) between two
* dates. i.e. if one date is before the DST changeover, and the other
* date is after, the resulting duration will represent the DST offset.
*
* @param self a Date
* @param other another Date
* @return a Duration
*/
public static
Duration getRelativeDaylightSavingsOffset(
Date self,
Date other) {
Duration d1 =
getDaylightSavingsOffset(
self);
Duration d2 =
getDaylightSavingsOffset(
other);
return new
TimeDuration(0, 0, 0, (int) (
d2.
toMilliseconds() -
d1.
toMilliseconds()));
}
/**
* Subtract one date from the other.
*
* @param lhs a Date
* @param rhs another Date
* @return a Duration
*/
public static
TimeDuration minus(final
Date lhs, final
Date rhs) {
long
milliseconds =
lhs.
getTime() -
rhs.
getTime();
long
days =
milliseconds / (24 * 60 * 60 * 1000);
milliseconds -=
days * 24 * 60 * 60 * 1000;
int
hours = (int) (
milliseconds / (60 * 60 * 1000));
milliseconds -=
hours * 60 * 60 * 1000;
int
minutes = (int) (
milliseconds / (60 * 1000));
milliseconds -=
minutes * 60 * 1000;
int
seconds = (int) (
milliseconds / 1000);
milliseconds -=
seconds * 1000;
return new
TimeDuration((int)
days,
hours,
minutes,
seconds, (int)
milliseconds);
}
/*
* Methods on Integer to implement 1.month, 4.years etc.
*/
public static
DatumDependentDuration getMonths(final
Integer self) {
return new
DatumDependentDuration(0,
self, 0, 0, 0, 0, 0);
}
public static
DatumDependentDuration getMonth(final
Integer self) {
return
getMonths(
self);
}
public static
DatumDependentDuration getYears(final
Integer self) {
return new
DatumDependentDuration(
self, 0, 0, 0, 0, 0, 0);
}
public static
DatumDependentDuration getYear(final
Integer self) {
return
getYears(
self);
}
/*
* Methods on Integer to implement 1.week, 4.days etc.
*/
public static
Duration getWeeks(final
Integer self) {
return new
Duration(
self * 7, 0, 0, 0, 0);
}
public static
Duration getWeek(final
Integer self) {
return
getWeeks(
self);
}
public static
Duration getDays(final
Integer self) {
return new
Duration(
self, 0, 0, 0, 0);
}
public static
Duration getDay(final
Integer self) {
return
getDays(
self);
}
public static
TimeDuration getHours(final
Integer self) {
return new
TimeDuration(0,
self, 0, 0, 0);
}
public static
TimeDuration getHour(final
Integer self) {
return
getHours(
self);
}
public static
TimeDuration getMinutes(final
Integer self) {
return new
TimeDuration(0, 0,
self, 0, 0);
}
public static
TimeDuration getMinute(final
Integer self) {
return
getMinutes(
self);
}
public static
TimeDuration getSeconds(final
Integer self) {
return new
TimeDuration(0, 0, 0,
self, 0);
}
public static
TimeDuration getSecond(final
Integer self) {
return
getSeconds(
self);
}
public static
TimeDuration getMilliseconds(final
Integer self) {
return new
TimeDuration(0, 0, 0, 0,
self);
}
public static
TimeDuration getMillisecond(final
Integer self) {
return
getMilliseconds(
self);
}
}