带时区信息的日期对话

Date conversation with time zone information

我有一个问题。该论坛中可能已经有解决方案,但我找不到任何东西。如果已经回答,请分享。

场景如下。

我的应用程序在 CET 中收到请求,在 UTac 时区 运行。我的后台存储过程在CET区运行。作为带有 cet 偏移量的字符串传入的时间我需要将与 SQL 日期相同的日期发送到我的后端。

当前实施是:

将字符串日期转换为偏移日期。然后从那个 offsetdate 创建 Instant,然后使用那个 instant 创建 util date。一旦我有直到日期,我将其转换为 SQL 日期。

所以这里的问题是如果输入请求我们 2012-07-15T00:00:00+02:00 那么当 UTC 中 运行 的应用程序使用 cet 偏移信息给出正确的偏移日期但是当它正在转换为即时然后总是 UTC 会来。所以新日期是 2012-07-14T00:00:00Z 并且因为如果这是我的 util 和 SQL 日期也将落后 1 天。

如果有任何其他方法可以创建 SQL 或 util.不论任何时区,同一日期的日期?

因为期望请求可以与任何时区一起出现,我们需要了解该时区,然后相应地转换或使用相同的日期应该去后端。

API 开发:Spring 使用 JAVA 8 启动,我们正在使用存储过程访问后端,其中存储过程预计在 SQL 日期。

由于您可以使用 OffsetDate 和来自 java.time 的其他 类,现代 Java 日期和时间 API,您不应再使用java.util.Date 也不 java.sql.Date。那些 类 设计不佳且早已过时,而现代 API 提供了您需要的所有功能。您可能认为您需要一个 java.sql.Date 来存储到您的 SQL 数据库中。但是使用 JDBC 4.2(或较新的 JPA 实现,如 Hibernate),您可以直接将 LocalDate 存储在那里,您会更喜欢。

    String requestString = "2012-07-15T00:00:00+02:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(requestString);
    LocalDate date = dateTime.toLocalDate();
    System.out.println("Date is " + date);

这会打印:

Date is 2012-07-15

没有一天是迷失的。保存例如:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table (your_date) values (?);");
    ps.setObject(1, date);
    ps.executeUpdate();

有时我们需要将 old-fashioned 类型传递给无法立即更改的遗留 API。如果这是您想要 java.sql.Date 的原因,请像这样转换:

    java.sql.Date sqlDate = java.sql.Date.valueOf(date);
    System.out.println("Old-fashioned java.sql.Date is " + sqlDate);

Old-fashioned java.sql.Date is 2012-07-15

仍然没有失去一天。

编辑: 如果您的遗产 API 需要的是 java.util.Date,您需要知道转换的方式:

    Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date oldFashionedUtilDate = Date.from(startOfDay);
    System.out.println("As old-fashioned java.util.Date: " + oldFashionedUtilDate);

当我 运行 使用默认时区 UTC 时,输出为:

As old-fashioned java.util.Date: Sun Jul 15 00:00:00 UTC 2012