/*
* Copyright by Mike Mirzayanov
*/
package me.pbox.site.util;
import org.nocturne.main.ApplicationContext;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
/**
* @author alazarev
*/
public class DateUtil {
private static final String SYSTEM_DATE_FORMAT_STRING = "yyyy-MM-dd";
private static final String SYSTEM_DATE_TIME_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
private static final String SYSTEM_TIME_FORMAT_STRING = "HH:mm:ss";
private static final String DEFAULT_DATE_FORMAT_STRING = "MMM/dd/yyyy";
private static final String RU_DATE_FORMAT_STRING = "dd.MM.yyyy";
private static final String DEFAULT_DATE_TIME_FORMAT_STRING = "MMM/dd/yyyy HH:mm";
private static final String RU_DATE_TIME_FORMAT_STRING = "dd.MM.yyyy HH:mm";
private static final String DEFAULT_TIME_FORMAT_STRING = "HH:mm";
private static final String RU_TIME_FORMAT_STRING = "HH:mm";
private static final ThreadLocal<DateFormat> SYSTEM_DATE_FORMAT = newSimpleDateFormat(SYSTEM_DATE_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> DEFAULT_DATE_FORMAT = newSimpleDateFormat(DEFAULT_DATE_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> RU_DATE_FORMAT = newSimpleDateFormat(RU_DATE_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> DEFAULT_DATE_TIME_FORMAT = newSimpleDateFormat(DEFAULT_DATE_TIME_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> RU_DATE_TIME_FORMAT = newSimpleDateFormat(RU_DATE_TIME_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> DEFAULT_TIME_FORMAT = newSimpleDateFormat(DEFAULT_TIME_FORMAT_STRING, LocaleUtil.getDefaultLocale());
private static final ThreadLocal<DateFormat> RU_TIME_FORMAT = newSimpleDateFormat(RU_TIME_FORMAT_STRING, LocaleUtil.getDefaultLocale());
public static String getSystemDateFormatString() {
return SYSTEM_DATE_FORMAT_STRING;
}
public static String getSystemDateTimeFormatString() {
return SYSTEM_DATE_TIME_FORMAT_STRING;
}
public static String getSystemTimeFormatString() {
return SYSTEM_TIME_FORMAT_STRING;
}
public static ThreadLocal<DateFormat> newSimpleDateFormat(final String pattern, final Locale locale) {
return new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat(pattern, locale);
}
};
}
public static ThreadLocal<DateFormat> newSimpleDateFormat(String pattern) {
return newSimpleDateFormat(pattern, null);
}
private DateUtil() {
}
public static String toSystemDateString(Date date) {
return SYSTEM_DATE_FORMAT.get().format(date);
}
public static java.sql.Date fromSystemDateString(String stringDate) throws ParseException {
return new java.sql.Date(SYSTEM_DATE_FORMAT.get().parse(stringDate).getTime());
}
public static String getDateFormatString(Locale locale) {
if (LocaleUtil.isRussian(locale)) {
return RU_DATE_FORMAT_STRING;
} else {
return DEFAULT_DATE_FORMAT_STRING;
}
}
public static String getDateTimeFormatString(Locale locale) {
if (LocaleUtil.isRussian(locale)) {
return RU_DATE_TIME_FORMAT_STRING;
} else {
return DEFAULT_DATE_TIME_FORMAT_STRING;
}
}
public static String getTimeFormatString(Locale locale) {
if (LocaleUtil.isRussian(locale)) {
return RU_TIME_FORMAT_STRING;
} else {
return DEFAULT_TIME_FORMAT_STRING;
}
}
public static DateFormat getDateFormat(Locale locale) {
ThreadLocal<DateFormat> format = DEFAULT_DATE_FORMAT;
if (LocaleUtil.isRussian(locale)) {
format = RU_DATE_FORMAT;
}
return format.get();
}
public static DateFormat getDateTimeFormat(Locale locale) {
ThreadLocal<DateFormat> format = DEFAULT_DATE_TIME_FORMAT;
if (LocaleUtil.isRussian(locale)) {
format = RU_DATE_TIME_FORMAT;
}
return format.get();
}
public static DateFormat getTimeFormat(Locale locale) {
ThreadLocal<DateFormat> format = DEFAULT_TIME_FORMAT;
if (LocaleUtil.isRussian(locale)) {
format = RU_TIME_FORMAT;
}
return format.get();
}
public static Date parse(String day, String time) throws ParseException {
String localeCode = LocaleUtil.getCode(ApplicationContext.getInstance().getLocale());
return parse(day, time, localeCode);
}
private static Date parse(String day, String time, String code) throws ParseException {
String datetime = day.trim() + ' ' + time.trim();
try {
return getDateTimeFormat(LocaleUtil.getLocale(code)).parse(datetime);
} catch (ParseException ignored) {
return getDateTimeFormat(LocaleUtil.getLocale(LocaleUtil.getOtherLocale(code))).parse(datetime);
}
}
public static Date add(Date time, int calendarField, int amount) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(time);
calendar.add(calendarField, amount);
return calendar.getTime();
}
public static String getDateTimeFormatted(Date date, Locale locale) {
return getDateTimeFormat(locale).format(date);
}
}