【发布时间】:2011-12-22 07:35:27
【问题描述】:
我在配置了夏令时(美国/圣保罗时区)的机器上使用 Spring MVC。在我的表单类中,我使用注释 DateTimeFormat 来配置我的 Date 的输出:
public class JustificativaOcorForm {
...
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dataMarcacao;
...
}
在调试时,我得到的日期是 16/10/2011 (dd/MM/yyyy),这是白天时间的开始,但 Spring 将其转换为 2011 年 10 月 15 日。为什么?
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converting value Sun Oct 16 00:00:00 BRST 2011 of [TypeDescriptor @javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.util.Date] to [TypeDescriptor java.lang.Long]
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to 1318730400000
2011-11-04 16:35:32,010 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to '2011-10-15'
我看到这个问题:@DateTimeFormat in Spring produces off-by-one day error
但是 Spring 3 使用 Joda-Time,我的类路径中有 joda-time-2.0.jar,所以我不知道为什么会发生这种情况以及如何解决它。
[编辑]
我已经测试过创建 LocalData 对象,并且发现了一些东西:
LocalDate ld = new LocalDate( new SimpleDateFormat("dd/MM/yyyy").parse("16/10/2011").getTime() );
System.out.println( new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format( ld.toDate() ) );
//prints 15/10/2011 00:00:00 -0200 BRST
LocalDate ld2 = new LocalDate( 2011,10,16 );
System.out.println( new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format( ld2.toDate() ) );
//prints 16/10/2011 00:00:00 -0200 BRST
似乎第一种方法是认为时间是UTC,因为调试我可以看到Joda使用了DateTimeZone类的convertUTCToLocal方法。
也许这也是 Spring 的默认设置,他希望也有一个 UTC 日期,而我正在通过 BRT 日期。
所以我认为我的解决方案是将对象更改为 LocalDate 并使用第二种方式创建此对象的实例。
【问题讨论】:
-
不清楚 - 你是在转换 to 字符串,还是 from 字符串?另外,如果这只是一个日期,最好使用 Joda 的
LocalDate类型。 -
@JonSkeet 这是字符串的日期。我可以用 @DateTimeFormat 设置 LocalDate 吗?
-
我当然希望如此。请注意,您的
Date值似乎是 10 月 16 日午夜 BRST ......这是故意的吗?诚然,将其格式化为 10 月 15 日很奇怪......但如果您使用日期,通常最好完全避开时区:) -
@JonSkeet 我认为值是 BRST 因为服务器的时区。有趣的是,使用 SimpleDateFormat 我没有这个问题。另外,在 Spring MVC 上下文中配置 java 以避免时区的最佳方法是什么?
-
不幸的是,虽然我在时区上很舒服,但我根本没有使用过 Spring MVC :(
标签: java spring-mvc jodatime dst