package org.joget.commons.util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.apache.commons.collections.map.ListOrderedMap;
import org.springframework.context.i18n.LocaleContextHolder;
/**
* Utility methods to deal with Time Zone
*
*/
public class TimeZoneUtil {
private static String serverTimeZone;
private static String serverTimeZoneId;
public static ListOrderedMap list;
private TimeZoneUtil() {
}
/**
* Retrieve a list of Time Zone
* @return a map of time zone id and its description
*/
public static Map<String, String> getList() {
if (list == null) {
list = new ListOrderedMap();
list.put("", "");
list.put("-12", ResourceBundleUtil.getMessage("timezone.gmt.-12"));
list.put("-11", ResourceBundleUtil.getMessage("timezone.gmt.-11"));
list.put("-10", ResourceBundleUtil.getMessage("timezone.gmt.-10"));
list.put("-9", ResourceBundleUtil.getMessage("timezone.gmt.-9"));
list.put("-8", ResourceBundleUtil.getMessage("timezone.gmt.-8"));
list.put("-7", ResourceBundleUtil.getMessage("timezone.gmt.-7"));
list.put("-6", ResourceBundleUtil.getMessage("timezone.gmt.-6"));
list.put("-5", ResourceBundleUtil.getMessage("timezone.gmt.-5"));
list.put("-4", ResourceBundleUtil.getMessage("timezone.gmt.-4"));
list.put("-3.5", ResourceBundleUtil.getMessage("timezone.gmt.-3.5"));
list.put("-3", ResourceBundleUtil.getMessage("timezone.gmt.-3"));
list.put("-2", ResourceBundleUtil.getMessage("timezone.gmt.-2"));
list.put("-1", ResourceBundleUtil.getMessage("timezone.gmt.-1"));
list.put("0", ResourceBundleUtil.getMessage("timezone.gmt.0"));
list.put("1", ResourceBundleUtil.getMessage("timezone.gmt.1"));
list.put("2", ResourceBundleUtil.getMessage("timezone.gmt.2"));
list.put("3", ResourceBundleUtil.getMessage("timezone.gmt.3"));
list.put("3.5", ResourceBundleUtil.getMessage("timezone.gmt.3.5"));
list.put("4", ResourceBundleUtil.getMessage("timezone.gmt.4"));
list.put("4.5", ResourceBundleUtil.getMessage("timezone.gmt.4.5"));
list.put("5", ResourceBundleUtil.getMessage("timezone.gmt.5"));
list.put("5.5", ResourceBundleUtil.getMessage("timezone.gmt.5.5"));
list.put("5.75", ResourceBundleUtil.getMessage("timezone.gmt.5.75"));
list.put("6", ResourceBundleUtil.getMessage("timezone.gmt.6"));
list.put("6.5", ResourceBundleUtil.getMessage("timezone.gmt.6.5"));
list.put("7", ResourceBundleUtil.getMessage("timezone.gmt.7"));
list.put("8", ResourceBundleUtil.getMessage("timezone.gmt.8"));
list.put("9", ResourceBundleUtil.getMessage("timezone.gmt.9"));
list.put("9.5", ResourceBundleUtil.getMessage("timezone.gmt.9.5"));
list.put("10", ResourceBundleUtil.getMessage("timezone.gmt.10"));
list.put("11", ResourceBundleUtil.getMessage("timezone.gmt.11"));
list.put("12", ResourceBundleUtil.getMessage("timezone.gmt.12"));
String[] timezones = TimeZone.getAvailableIDs();
List<String> sortedKeys=new ArrayList<String>(Arrays.asList(timezones));
Collections.sort(sortedKeys);
ListOrderedMap otherList = new ListOrderedMap();
for (String tzid : sortedKeys) {
TimeZone tz = TimeZone.getTimeZone(tzid);
if (!tz.getDisplayName(true, TimeZone.SHORT).startsWith("GMT")) {
String display = "(" + tz.getDisplayName(true, TimeZone.SHORT) + ") ";
String tzname = tzid.replace("/", " - ");
tzname = tzname.replace("_", " ");
display += tzname;
otherList.put(tzid, display);
}
}
list.putAll(otherList);
}
return list;
}
/**
* Retrieve Server Time Zone in GMT format
* @return GMT Time Zone
*/
public static String getServerTimeZone() {
if (serverTimeZone == null) {
serverTimeZone = Integer.toString(TimeZone.getDefault().getRawOffset() / (60 * 60 * 1000));
}
return serverTimeZone;
}
/**
* Retrieve Server Time Zone ID
* @return
*/
public static String getServerTimeZoneID() {
if (serverTimeZoneId == null) {
serverTimeZoneId = TimeZone.getDefault().getID();
}
return serverTimeZoneId;
}
/**
* Convert Date to String based on GMT/Timezone ID and Date Format
* @param time Datetime to convert
* @param gmt GMT ("-12" to "12") or Timezone ID, NULL to use System/User selected timezone
* @param format Date Format
* @return Date in converted String
*/
public static String convertToTimeZone(Date time, String gmt, String format) {
if (time == null) {
return "";
}
if (format == null || format.trim().length() == 0) {
format = ResourceBundleUtil.getMessage("console.setting.general.default.systemDateFormat");
}
SimpleDateFormat dateFormat;
try {
dateFormat = new SimpleDateFormat(format, LocaleContextHolder.getLocale());
} catch (Exception e) {
dateFormat = new SimpleDateFormat(ResourceBundleUtil.getMessage("console.setting.general.default.systemDateFormat"), LocaleContextHolder.getLocale());
}
if (gmt != null && !gmt.isEmpty()) {
dateFormat.setTimeZone(TimeZone.getTimeZone(getTimeZoneByGMT(gmt)));
} else {
dateFormat.setTimeZone(LocaleContextHolder.getTimeZone());
}
return dateFormat.format(time);
}
/**
* Get Time Zone ID by GMT
* @param gmt GMT ("-12" to "12")
* @return Time Zone ID
*/
public static String getTimeZoneByGMT(String gmt) {
if (gmt != null && gmt.trim().length() > 0) {
String tz = null;
if (gmt.contains(".")) {
Double rawoffset = Double.parseDouble(gmt) * 60 * 60 * 1000;
tz = TimeZone.getAvailableIDs(rawoffset.intValue())[0];
} else {
try {
if (Integer.parseInt(gmt) > 0) {
gmt = "+" + gmt;
}
tz = TimeZone.getTimeZone("GMT" + gmt).getID();
} catch (NumberFormatException e) {
tz = gmt;
}
}
if (tz != null && tz.trim().length() > 0) {
return tz;
}
}
return TimeZone.getDefault().getID();
}
}