package org.apereo.cas.util;
import org.joda.time.DateTime;
import org.joda.time.ReadableInstant;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* @author Timur Duehr timur.duehr@nccgroup.trust
* @since 5.0.0
*/
public final class DateTimeUtils {
private DateTimeUtils() {
}
/**
* Parse the given value as a local datetime.
*
* @param value the value
* @return the date/time instance
*/
public static LocalDateTime localDateTimeOf(final String value) {
try {
return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
} catch (final Exception e) {
return null;
}
}
/**
* Parse the given value as a zoned datetime.
*
* @param value the value
* @return the date/time instance
*/
public static ZonedDateTime zonedDateTimeOf(final String value) {
try {
return ZonedDateTime.parse(value);
} catch (final Exception e) {
return null;
}
}
/**
* Utility for creating a ZonedDateTime object from a ZonedDateTime.
*
* @param time ZonedDateTime to be copied
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final ZonedDateTime time) {
return ZonedDateTime.from(time);
}
/**
* Utility for creating a ZonedDateTime object from a millisecond timestamp.
*
* @param time Milliseconds since Epoch UTC
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final long time) {
return zonedDateTimeOf(time, ZoneOffset.UTC);
}
/**
* Utility for creating a ZonedDateTime object from a millisecond timestamp.
*
* @param time Miliseconds since Epoch
* @param zoneId Time zone
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final long time, final ZoneId zoneId) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(time), zoneId);
}
/**
* Local date time of local date time.
*
* @param time the time
* @return the local date time
*/
public static LocalDateTime localDateTimeOf(final long time) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.systemDefault());
}
/**
* Local date time of local date time.
*
* @param time the time
* @return the local date time
*/
public static LocalDateTime localDateTimeOf(final Date time) {
return localDateTimeOf(time.getTime());
}
/**
* Gets ZonedDateTime for ReadableInstant.
*
* @param time Time object to be converted.
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final ReadableInstant time) {
return zonedDateTimeOf(time.getMillis());
}
/**
* Gets ZonedDateTime for Date.
*
* @param time Time object to be converted.
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final Date time) {
return zonedDateTimeOf(time.getTime());
}
/**
* Gets ZonedDateTime for Calendar.
*
* @param time Time object to be converted.
* @return ZonedDateTime representing time
*/
public static ZonedDateTime zonedDateTimeOf(final Calendar time) {
return ZonedDateTime.ofInstant(time.toInstant(), time.getTimeZone().toZoneId());
}
/**
* Gets DateTime for Instant.
*
* @param time Time object to be converted.
* @return DateTime representing time
*/
public static DateTime dateTimeOf(final Instant time) {
return new DateTime(time.toEpochMilli());
}
/**
* Gets DateTime for ZonedDateTime.
*
* @param time Time object to be converted.
* @return DateTime representing time
*/
public static DateTime dateTimeOf(final ZonedDateTime time) {
return dateTimeOf(time.toInstant());
}
/**
* Gets Date for ZonedDateTime.
*
* @param time Time object to be converted.
* @return Date representing time
*/
public static Date dateOf(final ZonedDateTime time) {
return dateOf(time.toInstant());
}
/**
* Gets Date for Instant.
*
* @param time Time object to be converted.
* @return Date representing time
*/
public static Date dateOf(final Instant time) {
return Date.from(time);
}
/**
* Gets Timestamp for ZonedDateTime.
*
* @param time Time object to be converted.
* @return Timestamp representing time
*/
public static Timestamp timestampOf(final ZonedDateTime time) {
return timestampOf(time.toInstant());
}
/**
* Gets Timestamp for Instant.
*
* @param time Time object to be converted.
* @return Timestamp representing time
*/
private static Timestamp timestampOf(final Instant time) {
return Timestamp.from(time);
}
/**
* To time unit time unit.
*
* @param tu the tu
* @return the time unit
*/
public static TimeUnit toTimeUnit(final ChronoUnit tu) {
if (tu == null) {
return null;
}
switch (tu) {
case DAYS:
return TimeUnit.DAYS;
case HOURS:
return TimeUnit.HOURS;
case MINUTES:
return TimeUnit.MINUTES;
case SECONDS:
return TimeUnit.SECONDS;
case MICROS:
return TimeUnit.MICROSECONDS;
case MILLIS:
return TimeUnit.MILLISECONDS;
case NANOS:
return TimeUnit.NANOSECONDS;
default:
throw new UnsupportedOperationException("Temporal unit is not supported");
}
}
/**
* To chrono unit.
*
* @param tu the tu
* @return the chrono unit
*/
public static ChronoUnit toChronoUnit(final TimeUnit tu) {
if (tu == null) {
return null;
}
switch (tu) {
case DAYS:
return ChronoUnit.DAYS;
case HOURS:
return ChronoUnit.HOURS;
case MINUTES:
return ChronoUnit.MINUTES;
case SECONDS:
return ChronoUnit.SECONDS;
case MICROSECONDS:
return ChronoUnit.MICROS;
case MILLISECONDS:
return ChronoUnit.MILLIS;
case NANOSECONDS:
return ChronoUnit.NANOS;
default:
return null;
}
}
}