package in.partake.base;
import in.partake.resource.Constants;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Formatter;
import java.util.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
/**
* Time utility functions.
*
* @author shinyak
*/
public final class TimeUtil {
public static final TimeZone JST_TIMEZONE;
static {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
JST_TIMEZONE = registry.getTimeZone("Asia/Tokyo");
}
private static DateTime currentDateTime;
private TimeUtil() {
// Prevents from instantiation.
}
/**
* Resets the current date.
*/
public static void resetCurrentDate() {
TimeUtil.currentDateTime = null;
}
/**
* 現在時刻を返す。もし、現在時刻が陽に設定されていれば、その時刻を返す。
* そうでなければ、OS から現在時刻を取得して返す。
* @return
*/
public static DateTime getCurrentDateTime() {
if (currentDateTime != null)
return new DateTime(currentDateTime.getTime());
else
return new DateTime(System.currentTimeMillis());
}
/**
* 現在時刻をミリ秒単位で返す。現在時刻が陽に設定されていれば、その現在時刻を返す。
* そうでなければ、new Date().getTime() と同じ。
* @return
*/
public static long getCurrentTime() {
if (currentDateTime != null)
return currentDateTime.getTime();
else
return new Date().getTime();
}
public static void setCurrentDateTime(DateTime dt) {
currentDateTime = dt;
}
public static void setCurrentTime(long time) {
currentDateTime = new DateTime(time);
}
/**
* Waits for a while.
*/
public static void waitForTick() {
if (currentDateTime != null) {
setCurrentTime(currentDateTime.getTime() + 20);
return;
}
long now = new Date().getTime();
do {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// ignore.
}
} while (now == TimeUtil.getCurrentTime());
}
public static DateTime create(int year, int month, int date, int hour, int min, int sec) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, date);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, min);
calendar.set(Calendar.SECOND, sec);
calendar.set(Calendar.MILLISECOND, 0);
calendar.setTimeZone(TimeZone.getTimeZone("JST"));
return new DateTime(calendar.getTime());
}
public static Date create(int year, int month, int date, int hour, int min, int sec, TimeZone timeZone) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, date);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, min);
calendar.set(Calendar.SECOND, sec);
calendar.set(Calendar.MILLISECOND, 0);
calendar.setTimeZone(timeZone);
return calendar.getTime();
}
public static Calendar calendar(Date date) {
if (date == null)
return null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
public static String formatForEvent(DateTime date) {
DateFormat dateFormatForEvent = new SimpleDateFormat(Constants.READABLE_DATE_FORMAT);
return dateFormatForEvent.format(date.toDate());
}
public static DateTime parseForEvent(String dateStr) {
DateFormat dateFormatForEvent = new SimpleDateFormat(Constants.READABLE_DATE_FORMAT);
try {
return new DateTime(dateFormatForEvent.parse(dateStr).getTime());
} catch (ParseException e) {
// DO NOTHING.
}
try {
long time = Long.valueOf(dateStr);
return new DateTime(time);
} catch (NumberFormatException e) {
// DO NOTHING
}
return null;
}
public static DateTime dateTimeFromTimeString(String timeString) {
try {
return new DateTime(Long.parseLong(timeString));
} catch (NumberFormatException e) {
return null;
}
}
public static String getTimeString(DateTime date) {
return getTimeString(date.getTime());
}
public static String getTimeString(long time) {
return new Formatter().format("%020d", time).toString();
}
}