转换时出现夏令时错误@DateTimeFormat



我在使用 @DateTimeFormat 注释转换实际上不存在的日期时遇到问题。

例如,当我将日期设置为 15/10/2017 时,我的实体中的注释如下所示:

@Column(nullable = false)
@NotNull
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date dataVisita;

我收到错误:

Failed To Convert Property Value Of Type Java.Lang.String To Required Type Java.Util.Date For Property DataVisita; 
Nested Exception Is Org.Springframework.Core.Convert.ConversionFailedException: 
    Failed To Convert From Type Java.Lang.String To Type @Javax.Persistence.Column @Javax.Validation.Constraints.NotNull @Org.Springframework.Format.Annotation.DateTimeFormat Java.Util.Date For Value 15/10/2017; 
Nested Exception Is Java.Lang.IllegalArgumentException: 
    Cannot Parse "15/10/2017": Illegal Instant Due To Time Zone Offset Transition (America/Sao_Paulo)

我知道错误告诉期15/10/2017 00:00:00实际上并不存在,但我想转换为15/10/2017 01:00:00,以这种方式忽略问题并找到相应的日期。

有没有办法让我覆盖@DateTimeFormat注释或将格式化程序指向宽松

试试这个:

@Column(可为空 = 假)

@NotNull

@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss")

私人日期数据访问a;

它似乎可以做你想做的事(调整 0:00 到 1:00),你需要实现一个验证器,如下所示:

public class PersonValidator implements Validator {
    /**
     * This Validator validates *just* Person instances
     */
    public boolean supports(Class clazz) {
        return Date.class.equals(clazz);
    }
    public void validate(Object obj, Errors e) {
        String dateString = (String) obj;
        DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
        DateTime ourDate = null;
        try {
            fmt.parseDateTime(dateString);
        } catch (IllegalArgumentException e) {
            // massage your hour here
        } finally {
            ourDate = fmt.parseDateTime(dateString);
        }
    }
}

对我来说,你不应该直接弄乱系统的语言环境。那你的问题到底是什么。

我的意思是你没有提供时区,所以你使用的是服务器之一。在此服务器上及其配置上,它将是这一天/日期。在另一台服务器上,它将是另一天/日期。

确保您以 UTC(因此没有夏令时和所有时间)或客户端在输入中提供的显式区域设置工作,使用本地日期来存储...要么保持这样,当你需要比较日期时,把它转换为UTC。这样问题就会消失。

一个快速解决方法是确保您的服务器使用 UTC,但从长远来看,您应该始终控制您使用的区域设置,因此提供的日期必须是 UTC,或者是本地日期,另一个字段提供时区。

如果你想使用DateTimeFormat Java 8类

和新的(自java 8以来)"java.time"框架的一部分,你可能需要使用Java 8 Date类:

日期:
java.time.LocalDate

时间:
java.time.LocalTime, java.time.OffsetTime

时间戳:
java.time.Instant, java.time.LocalDateTime, java.time.OffsetDateTime 和 java.time.ZonedDateTime

另外,您在Spring框架中使用哪种ORM?弹簧数据,休眠还是其他什么?如果您使用 Hibernate,请参阅Hibernate用户指南:映射日期/时间值

根据您在数据库中存储日期的方式以及服务器时区,解决方案是在 Spring 初始化时使用以下代码将默认时区设置为 UTC:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

这应该非常简单。

这里的问题是,您正在传递日期对象的字符串值。以下是相关注释的文档:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html

简单地说,这里是所需的类型:java.util.Date,java.util.Calendar,java.lang.Long,Joda-Time值类型

一种非常幼稚的方式:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date destnationDateToBeSaved = sdf.parse("15/10/2017");

推荐方式:

用:

@DateTimeFormat(iso = ISO.DATE_TIME)
private ZonedDateTime zonedDateTime;

// 'yyyy-MMM-dd HH:mm:ss' pattern or if preferred ISO
ZonedDateTime  destnationDateToBeSaved= ZonedDateTime.parse("2017-Oct-15 23:35:05", DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss").withZone(ZoneId.of("UTC"))); 

希望有帮助!

最新更新