带有时区信息的日期对话

时间:2019-07-15 04:11:45

标签: spring-boot date java-8 timezone-offset

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

情况如下。

请求正在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中。

1 个答案:

答案 0 :(得分:1)

由于您可以使用OffsetDate和现代Java日期和时间API java.time中的其他类,因此您不再应该使用java.util.Datejava.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