如何使用指定的时区获取Hibernate中的记录


  1. 我需要为我的应用程序提供支持不同的时区。
  2. 用于插入我的JVM的UTC时间为默认时间,因此在@CreationTimestamp和@updateTeTimestamp的帮助下创建和更新日期的Hibernate插入和更新日期,该日期引用了JVM TimeZone。
  3. 每个请求都来自不同的时区。根据时区,我需要将UTC时间分析为该特定时区。
  4. 我不想为所有记录手动分析日期。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())));
}

最新更新