如何使用指定的时区获取休眠中的记录?

时间:2017-12-12 15:05:00

标签: java hibernate jpa spring-data-jpa jpa-2.0

  1. 我需要为我的应用程序支持不同的时区。
  2. 为了插入我的JVM,默认使用UTC时间,因此在@CreationTimestamp和@UpdateTimestamp的帮助下,hibernate会将创建和更新日期作为UTC时间插入,这将引用JVM时区。
  3. 每个请求都来自不同的时区。根据时区,我需要将UTC时间解析为该特定时区。
  4. 我不想手动为所有记录解析日期。在hibernate中是否有任何选项,如果我在获取时指定时区。这样我就可以按照给定的时区获取创建和更新的日期(时区对于提取是动态的)。

2 个答案:

答案 0 :(得分:3)

关于日期时间的最佳做法,已经有几个主题,例如: Daylight saving time and time zone best practices

我建议如下:

  • 始终在后端和DB中处理所有日期时间为UTC。
  • 将日期时间作为UTC传输给您的客户。
  • 将UTC日期时间转换为客户端中的localdatetimezone。用于显示和更新目的。

根据我的经验,最好让客户端处理所有本地日期时间/区域转换,并承诺将UTC用于所有通信和后端用例。

如果您想将日期直接转储到网页中,可以使用http://momentjs.com/之类的js库将其转换为区域设置日期时间。

答案 1 :(得分:0)

您可以创建Utility(通用方法)以使用时区转换日期  下面是一些转换的例子。

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())));
}