package com.googlecode.totallylazy.time;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.comparators.Maximum;
import com.googlecode.totallylazy.comparators.Minimum;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import static java.util.Calendar.DAY_OF_MONTH;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.MILLISECOND;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.MONTH;
import static java.util.Calendar.SECOND;
import static java.util.Calendar.YEAR;
public class Dates {
public static final String RFC3339_WITHOUT_TIME = "yyyy-MM-dd";
public static final String RFC3339 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
public static final String RFC3339_WITH_MILLISECONDS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public static final String RFC822 = "EEE, dd MMM yyyy HH:mm:ss zzz";
public static final String JAVA_UTIL_DATE_TO_STRING = "EEE MMM dd HH:mm:ss zzz yyyy";
public static final String LEXICAL = "yyyyMMddHHmmssSSS";
public static final String APACHE = "dd/MMM/yyyy:HH:mm:ss Z";
public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
public static final TimeZone GMT = TimeZone.getTimeZone("GMT");
public static final Date MIN_VALUE = date(Long.MIN_VALUE);
public static final Date MAX_VALUE = date(Long.MAX_VALUE);
@Deprecated
public static final String LUCENE = LEXICAL;
@Deprecated
public static DateFormat LUCENE() {
return format(LEXICAL);
}
public static DateFormatConverter RFC3339() {
return new DateFormatConverter(RFC3339_WITH_MILLISECONDS, RFC3339, RFC3339_WITHOUT_TIME);
}
public static SimpleDateFormat format(final String pattern) {
return formatWithDefaultZone(pattern, UTC);
}
private static SimpleDateFormat formatWithDefaultZone(String pattern, TimeZone defaultTimeZone) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, Locale.ENGLISH);
simpleDateFormat.setTimeZone(defaultTimeZone);
simpleDateFormat.setLenient(false);
return simpleDateFormat;
}
public static Function1<Date, String> format(final DateFormat format) {
return value -> format.format(value);
}
public static DateFormat APACHE() {
return format(APACHE);
}
public static DateFormat LEXICAL() {
return format(LEXICAL);
}
public static DateFormat RFC822() {
return formatWithDefaultZone(RFC822, GMT);
}
public static DateFormat RFC3339withMilliseconds() {
return format(RFC3339_WITH_MILLISECONDS);
}
public static DateFormat javaUtilDateToString() {
return format(JAVA_UTIL_DATE_TO_STRING);
}
public static Date parse(String value) {
return date(value);
}
public static Function1<String, Date> parse(final DateFormat format) {
return value -> format.parse(value);
}
public static Function1<Date, Integer> millisecond() {
return calendarField(Calendar.MILLISECOND);
}
public static Function1<Date, Integer> second() {
return calendarField(Calendar.SECOND);
}
public static Function1<Date, Integer> minute() {
return calendarField(Calendar.MINUTE);
}
public static Function1<Date, Integer> hourOfDay() {
return calendarField(Calendar.HOUR_OF_DAY);
}
public static Function1<Date, Integer> dayOfWeek() {
return calendarField(Calendar.DAY_OF_WEEK);
}
public static Function1<Date, Integer> dayOfMonth() {
return calendarField(Calendar.DAY_OF_MONTH);
}
public static Function1<Date, Integer> weekOfMonth() {
return calendarField(Calendar.WEEK_OF_MONTH);
}
public static Function1<Date, Integer> month() {
return calendarField(Calendar.MONTH);
}
public static Function1<Date, Integer> dayOfYear() {
return calendarField(Calendar.DAY_OF_YEAR);
}
public static Function1<Date, Integer> year() {
return calendarField(Calendar.YEAR);
}
public static Function1<Date, Integer> calendarField(final int field) {
return value -> calendar(value).get(field);
}
public static Date date(String value) {
return DateFormatConverter.defaultConverter().parse(value);
}
public static Date date(long value) {
return new Date(value);
}
public static Date date(int year, int month, int day) {
return date(year, month, day, 0);
}
public static Date date(int year, int month, int day, int hour) {
return date(year, month, day, hour, 0);
}
public static Date date(int year, int month, int day, int hour, int minute) {
return date(year, month, day, hour, minute, 0);
}
public static Date date(int year, int month, int day, int hour, int minute, int second) {
return date(year, month, day, hour, minute, second, 0);
}
public static Date date(int year, int month, int day, int hour, int minute, int second, int milliSec) {
GregorianCalendar calendar = calendar();
calendar.set(YEAR, year);
calendar.set(MONTH, month - 1);
calendar.set(DAY_OF_MONTH, day);
calendar.set(HOUR_OF_DAY, hour);
calendar.set(MINUTE, minute);
calendar.set(SECOND, second);
calendar.set(MILLISECOND, milliSec);
return calendar.getTime();
}
@Deprecated
public static Date addSeconds(Date date, int amount) {
return Seconds.add(date, amount);
}
public static GregorianCalendar calendar() {
return new GregorianCalendar(UTC);
}
public static GregorianCalendar calendar(Date date) {
GregorianCalendar calendar = calendar();
calendar.setTime(date);
return calendar;
}
public static Date add(Date date, int timeUnit, int amount) {
GregorianCalendar calendar = Dates.calendar(date);
calendar.add(timeUnit, amount);
return calendar.getTime();
}
public static Date subtract(Date date, int timeUnit, int amount) {
return add(date, timeUnit, -amount);
}
public static Date stripTime(Date date) {
Calendar calendar = calendar();
calendar.setTime(date);
calendar.set(HOUR_OF_DAY, 0);
calendar.set(MINUTE, 0);
calendar.set(SECOND, 0);
calendar.set(MILLISECOND, 0);
return calendar.getTime();
}
public static Maximum.Function<Date> maximum() {
return Maximum.constructors.maximum(Dates.MIN_VALUE);
}
public static Minimum.Function<Date> minimum() {
return Minimum.constructors.minimum(Dates.MAX_VALUE);
}
public static Date date(Date date) {
return new Date(date.getTime());
}
}