我有一个问题。解决方案可能已经在此论坛中存在,但我找不到任何东西。如果已经回答,请分享。
情况如下。
请求正在CET中发送到我的在UTac时区运行的应用程序。我的后端存储过程正在CET区域中运行。作为带有cet偏移量的字符串的时间,我需要将与sql date相同的日期发送到我的后端。
当前实现为:
将字符串日期转换为offsetdate。然后从该offsetdate创建即时,然后使用该即时创建使用日期。一旦有了使用日期,我就将其转换为sql。日期。
所以这里的问题是,如果输入要求我们2012-07-15T00:00:00 + 02:00,那么 当在UTC中运行的应用程序给出正确的偏移量时 带有CET偏移量信息的日期,但是当它转换为即时时 然后总是UTC会来。所以新日期是2012-07-14T00:00:00Z并且 因为如果我的util和sql日期也要晚1天。
任何人都可以指导我是否还有其他方法可以创建sql或utill。相同日期的日期,而不考虑任何时区? 因为期望是请求可以与任何时区一起出现,所以我们需要了解该时区,然后进行相应的转换或使用,并且相同的日期应该返回到后端。
开发的API:使用JAVA 8和 我们正在使用存储过程访问后端,其中存储过程期望在SQL Date中。
答案 0 :(得分:1)
由于您可以使用OffsetDate
和现代Java日期和时间API java.time中的其他类,因此您不再应该使用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);
此打印:
日期是2012-07-15
没有一天会消失。要保存,例如:
PreparedStatement ps = yourDatabaseConnection.prepareStatement(
"insert into your_table (your_date) values (?);");
ps.setObject(1, date);
ps.executeUpdate();
有时候,我们需要将老式类型传递给我们无法立即更改的传统API。如果这是您想要java.sql.Date
的原因,请像这样转换:
java.sql.Date sqlDate = java.sql.Date.valueOf(date);
System.out.println("Old-fashioned java.sql.Date is " + sqlDate);
老式java.sql.Date是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运行时,输出为:
作为老式的java.util.Date:Sun UTC 2012年7月15日00:00:00