春天的日期转换是休息一天

时间:2015-07-14 05:25:29

标签: java spring spring-mvc time

我有一个POST端点,需要几个值,一个是endDate和startDate。当JSON发布为:

{ "startDate" : "2015-01-30", "endDate" : "2015-12-30" }

Spring将它转换为总是落后一天的java.util.Date对象。在日志中我看到:

Validating that startDate Thu Jan 29 16:00:00 PST 2015 < endDate Tue Dec 29 16:00:00 PST 2015

所以它的时区是正确的。我原以为它与UTC转换有关,但我不确定如何配置或修改它以便它使用适当的偏移来转换它。它的时间戳部分并不是必需的 - 我只关心年,日和月与传入的内容相匹配。

如果重要,我使用Spring(发生在4.0.6和4.1.7)和POST

3 个答案:

答案 0 :(得分:3)

String str="2015-01-30";
try{
    SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd");
    isoFormat.setTimeZone(TimeZone.getTimeZone("PST"));
    Date date = isoFormat.parse(str);
    System.out.println(date);
}catch(ParseException e){
    e.printStackTrace();
}

答案 1 :(得分:1)

tl; dr

LocalDate.parse( "2015-01-30" )

为作业使用正确的数据类型

您正在尝试将仅日期值拟合为日期时间类型java.util.DateSquare peg, round hole。在尝试提出一个与您的日期相关联的时间时,会注入一个时区,因此出现了问题。

LocalDate

解决方案:

  • 永远不要使用可怕的旧式传统日期时间类,例如java.util.Date。仅使用现代的 java.time 类。

  • 对于仅日期值,请使用LocalDate

您输入的字符串恰好是标准ISO 8601格式。解析/生成字符串时, java.time 类默认使用ISO 8601格式。因此,无需指定格式设置模式。

LocalDate ld = LocalDate.parse( "2015-01-30" ) ;

ZonedDateTime

如果您想获取一个带有日期时间的日期,请让 java.time 确定一天中的第一时刻。永远不要假设时刻是00:00:00。在某些日期的某些区域中,由于诸如Daylight Saving Time (DST)之类的异常,可能是另一个时间,例如01:00:00。

ZonedId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;     // Let java.time determine the first moment of that date in that zone.

Instant

要从调整为UTC(相同的时刻,不同的时钟时间),请提取Instant

Instant instant = zdt.toInstant() ;  // Adjust to UTC. Same moment, same simultaneous point on the timeline, different wall-clock time.

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

点击此处http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-webdatabinder如何自定义自动Spring转换:

@Controller
public class MyFormController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
    // ...
}