- 我需要为我的应用程序提供支持不同的时区。
- 用于插入我的JVM的UTC时间为默认时间,因此在@CreationTimestamp和@updateTeTimestamp的帮助下创建和更新日期的Hibernate插入和更新日期,该日期引用了JVM TimeZone。 。
- 每个请求都来自不同的时区。根据时区,我需要将UTC时间分析为该特定时区。
- 我不想为所有记录手动分析日期。Hibernate中是否有任何选项,例如我在获取时指定时区。这样我就可以根据给定的时区获得创建和更新的日期(时区是动态获取的)。
已经有几个有关DateTime的最佳实践的线程,例如节省时间和时区最佳实践
我建议以下内容:
- 始终在后端和DB中处理所有数据量。
- 将日期时间运送到您的客户作为UTC。
- 将UTC DateTime转换为客户端中的LocalDateTimeZone。用于显示和更新目的。
根据我的经验,最好让客户处理所有本地的datetime/区域转换,并承诺将UTC用于所有通信和后端用户。
如果要直接将日期转储到网页中,则可以使用http://momentjs.com/这样的JS-Library将其转换为Locale DateTime。
您可以创建实用程序(通用方法)以使用时区转换日期 在下面的一些示例中进行转换。
public static Date buildUTCDate(String dateString) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat(SecureCareConstant.SQL_TIMESTAMP_FORMAT);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.parse(dateString);
}
public static String dateToString(Date date) {
return new SimpleDateFormat(SecureCareConstant.SQL_TIMESTAMP_FORMAT).format(date);
}
public static Date buildUTCDate(Date date) {
SimpleDateFormat fromDateFormat = new SimpleDateFormat(SecureCareConstant.SQL_TIMESTAMP_FORMAT);
SimpleDateFormat toDateFormat = new SimpleDateFormat(SecureCareConstant.SQL_TIMESTAMP_FORMAT);
toDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateString = new SimpleDateFormat(SecureCareConstant.SQL_TIMESTAMP_FORMAT).format(date);
try {
return fromDateFormat.parse(toDateFormat.format(fromDateFormat.parse(dateString)));
} catch (ParseException e) {
LOGGER.error("ParseException in buildUTCDate()", e);
}
return null;
}
public static Date getCurrentTimeZoneDate(final Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if (z.inDaylightTime(new Date())) {
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
c.add(Calendar.HOUR_OF_DAY, (+offsetHrs));
c.add(Calendar.MINUTE, (+offsetMins));
return c.getTime();
}
public static String toLocalTime(Date dateUTC) {
if (dateUTC == null) {
return StringUtils.EMPTY;
}
SimpleDateFormat dateFormat = new SimpleDateFormat(SecureCareConstant.WEB_SERVICE_DATE_FORMAT);
return dateFormat.format(new Date(dateUTC.getTime() + TimeZone.getDefault().getOffset(dateUTC.getTime())));
}