带时区信息的日期对话
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
我有一个问题。该论坛中可能已经有解决方案,但我找不到任何东西。如果已经回答,请分享。
场景如下。
我的应用程序在 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