【问题标题】:Java.util.Date says time Zone unaware working fine with different time ZonesJava.util.Date 表示时区不知道在不同时区工作正常
【发布时间】:2021-11-02 20:49:01
【问题描述】:

请原谅,我已经稍微更新了问题以进行详细说明。

我有一个配置为运行 UTC + 3(伊斯坦布尔)的 Angular 客户端 它调用了我在 UTC + 5(亚洲/卡拉奇)运行的服务器

我一直在使用 SpringJPA 和以下配置的 Spring boot

spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
spring.jackson.time-zone=Asia/Karachi
spring.jpa.properties.hibernate.jdbc.time_zone=UTC

我的数据库(MySql)在 UTC 中运行 即使 LocalDateTime 无法满足时区差异,Date 的结果也可以正常工作。 (我不怀疑 LocalDateTIme 而是 Java.Util.Date)

另外,我没有为实体中的 Date 属性添加任何特殊注释

Once REST API 调用记录日期

 date           Sun Sep 05 18:00:00 PKT 2021

DataType `date` DATETIME NULL 已用于 DB

那么 DB 中的结果如下,它是 UTC

我对 OffsetDateTime 和 ZonedDateTime 有相同的结果,但这很明显,因为两者都带有偏移量。但我需要解释一下日期。

谢谢。

【问题讨论】:

  • 这并不矛盾:java.util.Date 的实例不携带任何时区信息,但这并不意味着它不使用 i> JVM 默认时区。
  • Andy Turner 的评论是指 java.until.Date 类的 toString 方法在生成字符串时应用了 JVM 当前的默认时区。相当误导。从不使用该类的众多原因之一。仅使用 java.time 类。

标签: java date timezone


【解决方案1】:
    public String toString() {
        // "EEE MMM dd HH:mm:ss zzz yyyy";
        BaseCalendar.Date date = normalize();
        StringBuilder sb = new StringBuilder(28);
        int index = date.getDayOfWeek();
        if (index == BaseCalendar.SUNDAY) {
            index = 8;
        }
        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
        TimeZone zi = date.getZone();
        if (zi != null) {
            sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
        } else {
            sb.append("GMT");
        }
        sb.append(' ').append(date.getYear());  // yyyy
        return sb.toString();
    }

以上为Date.toString的来源。如您所见,使用了日历实用程序,并通过该实用程序将时区信息用于显示目的。 Date 本身并不是固有的,它在概念上是公正的,数字表示与时代的偏移。

【讨论】:

  • 您正在使用糟糕的日期时间类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。JPA(现在的 Jakarta Persistence)和 Jackson 都支持java.time.
  • @BasilBourque,我完全同意你的看法,但是仍然有很多人/应用程序使用 Date 类。此外,这不是在现实生活中应用的东西,而只是一个实验。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2016-11-28
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多