我有一个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
答案 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)
LocalDate.parse( "2015-01-30" )
您正在尝试将仅日期值拟合为日期时间类型java.util.Date
。 Square 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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));
}
// ...
}