/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.util;
import com.liferay.portal.kernel.language.LanguageUtil;
import java.text.Format;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* @author Brian Wing Shun Chan
*/
public class Time {
public static final long DAY = Time.HOUR * 24;
public static final String DURATION_FORMAT = "HH:mm:ss.SSS";
public static final long HOUR = Time.MINUTE * 60;
public static final long MINUTE = Time.SECOND * 60;
public static final long MONTH = Time.DAY * 30;
public static final String RFC822_FORMAT = "EEE, dd MMM yyyy HH:mm:ss Z";
public static final long SECOND = 1000;
public static final String SHORT_TIMESTAMP_FORMAT = "yyyyMMddkkmm";
public static final String TIMESTAMP_FORMAT = "yyyyMMddkkmmssSSS";
public static final long WEEK = Time.DAY * 7;
public static final long YEAR = Time.DAY * 365;
public static Date getDate(Calendar cal) {
Calendar adjustedCal = CalendarFactoryUtil.getCalendar();
adjustedCal.set(Calendar.YEAR, cal.get(Calendar.YEAR));
adjustedCal.set(Calendar.MONTH, cal.get(Calendar.MONTH));
adjustedCal.set(Calendar.DATE, cal.get(Calendar.DATE));
adjustedCal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
adjustedCal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE));
adjustedCal.set(Calendar.SECOND, cal.get(Calendar.SECOND));
adjustedCal.set(Calendar.MILLISECOND, cal.get(Calendar.MILLISECOND));
return adjustedCal.getTime();
}
public static Date getDate(Date date, TimeZone tz) {
Calendar cal = CalendarFactoryUtil.getCalendar(tz);
cal.setTime(date);
return getDate(cal);
}
public static Date getDate(TimeZone tz) {
Calendar cal = CalendarFactoryUtil.getCalendar(tz);
return getDate(cal);
}
public static String getDescription(long milliseconds) {
return getDescription(milliseconds, false);
}
public static String getDescription(
long milliseconds, boolean approximate) {
String s = StringPool.BLANK;
int x = 0;
if (approximate) {
if (milliseconds <= 0) {
s = "0 Seconds";
}
else if (milliseconds < MINUTE) {
x = (int)(milliseconds / SECOND);
s = x + " Second";
}
else if (milliseconds < HOUR) {
x = (int)(milliseconds / MINUTE);
s = x + " Minute";
}
else if (milliseconds < DAY) {
x = (int)(milliseconds / HOUR);
s = x + " Hour";
}
else if (milliseconds < MONTH) {
x = (int)(milliseconds / DAY);
s = x + " Day";
}
else if (milliseconds < YEAR) {
x = (int)(milliseconds / MONTH);
s = x + " Month";
}
else if (milliseconds >= YEAR) {
x = (int)(milliseconds / YEAR);
s = x + " Year";
}
}
else {
if ((milliseconds % WEEK) == 0) {
x = (int)(milliseconds / WEEK);
s = x + " Week";
}
else if ((milliseconds % DAY) == 0) {
x = (int)(milliseconds / DAY);
s = x + " Day";
}
else if ((milliseconds % HOUR) == 0) {
x = (int)(milliseconds / HOUR);
s = x + " Hour";
}
else if ((milliseconds % MINUTE) == 0) {
x = (int)(milliseconds / MINUTE);
s = x + " Minute";
}
else if ((milliseconds % SECOND) == 0) {
x = (int)(milliseconds / SECOND);
s = x + " Second";
}
else {
x = (int)milliseconds;
s = x + " Millisecond";
}
}
if ((x == 0) || (x > 1)) {
s += "s";
}
return s;
}
public static String getDuration(long milliseconds) {
return getSimpleDate(new Date(milliseconds), DURATION_FORMAT);
}
public static String getRelativeTimeDescription(
Date date, Locale locale, TimeZone timeZone) {
return getRelativeTimeDescription(date.getTime(), locale, timeZone);
}
public static String getRelativeTimeDescription(
Date date, Locale locale, TimeZone timeZone, Format dateTimeFormat) {
return getRelativeTimeDescription(
date.getTime(), locale, timeZone, dateTimeFormat);
}
public static String getRelativeTimeDescription(
long milliseconds, Locale locale, TimeZone timeZone) {
return getRelativeTimeDescription(milliseconds, locale, timeZone, null);
}
public static String getRelativeTimeDescription(
long milliseconds, Locale locale, TimeZone timeZone,
Format dateTimeFormat) {
Format timeFormat = FastDateFormatFactoryUtil.getTime(locale, timeZone);
int daysBetween = DateUtil.getDaysBetween(
new Date(milliseconds), new Date(), timeZone);
long millisAgo = System.currentTimeMillis() - milliseconds;
if (millisAgo < Time.HOUR) {
long minutes = millisAgo / Time.MINUTE;
if (minutes <= 1) {
return LanguageUtil.get(locale, "about-a-minute-ago");
}
return LanguageUtil.format(locale, "x-minutes-ago", minutes, false);
}
else if ((millisAgo / Time.HOUR) == 1) {
return LanguageUtil.get(locale, "about-an-hour-ago");
}
else if ((millisAgo < Time.DAY) || (daysBetween == 0)) {
return LanguageUtil.format(
locale, "x-hours-ago", millisAgo / Time.HOUR, false);
}
else if (daysBetween == 1) {
return LanguageUtil.format(
locale, "yesterday-at-x", timeFormat.format(milliseconds),
false);
}
if (dateTimeFormat == null) {
dateTimeFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
"EEEE, MMMMM dd, yyyy", locale, timeZone);
}
return dateTimeFormat.format(milliseconds);
}
public static String getRFC822() {
return getRFC822(new Date());
}
public static String getRFC822(Date date) {
return getSimpleDate(date, RFC822_FORMAT);
}
public static String getShortTimestamp() {
return getShortTimestamp(new Date());
}
public static String getShortTimestamp(Date date) {
return getSimpleDate(date, SHORT_TIMESTAMP_FORMAT);
}
public static String getSimpleDate(Date date, String format) {
String s = StringPool.BLANK;
if (date != null) {
Format dateFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
format);
s = dateFormat.format(date);
}
return s;
}
public static String getTimestamp() {
return getTimestamp(new Date());
}
public static String getTimestamp(Date date) {
return getSimpleDate(date, TIMESTAMP_FORMAT);
}
}