@DateTimeFormat转换

时间:2017-10-16 20:09:49

标签: java spring date formatter

我在使用@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注释或指示格式化程序是否宽松?

5 个答案:

答案 0 :(得分:3)

试试这个:

  

@Column(nullable = false)

     

@NotNull

     

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

     

私人日期dataVisita;

它似乎做你想要的(调整0:00到1:00),你需要实现validator,如下所示:

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);
        }
    }
}

答案 1 :(得分:1)

对我来说,你不应该直接搞乱系统的语言环境。这真的是你的问题。

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

确保您使用UTC工作(因此没有日光保存和全部)或客户端在输入中提供的显式区域设置,使用本地日期存储...要么保持这样,并且当您需要时比较日期,将其转换为UTC。这样问题就会消失。

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

答案 2 :(得分:0)

如果你想使用DateTimeFormat这是Java 8类和新的一部分(从java 8开始)" java.time"您可能需要使用Java 8 Date类的框架:

日期:
java.time.LocalDate

TIME:
java.time.LocalTime,java.time.OffsetTime

TIMESTAMP:
java.time.Instant,java.time.LocalDateTime,java.time.OffsetDateTime和java.time.ZonedDateTime

另外,您在Spring框架中使用哪个ORM? Spring数据,hibernate还是别的什么?如果您使用Hibernate,请参阅Hibernate用户指南:Mapping Date/Time Values

答案 3 :(得分:0)

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

(devhx_8_other2_name_2) is not null AND (devhx_8_other2_amt) is not null

答案 4 :(得分:0)

这应该非常简单。

这里的问题是,您正在传递Date对象的String值。以下是相关注释的文档:

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值类型

一种非常天真的方式:

N = 5
def f(x):
    x = x.astype(float)
    x.index = range(N + 1 - len(x), N + 1)
    return x.reindex(range(1, N + 1))

df1 = df1.groupby(level=0)['d','c'].apply(f).rename_axis((None, 'day')).reset_index(level=1)
print (df1)
    day    d    c
32    1  NaN  NaN
32    2  NaN  NaN
32    3  2.0  3.0
32    4  4.0  5.0
32    5  6.0  7.0
44    1  NaN  NaN
44    2  NaN  NaN
44    3  NaN  NaN
44    4  NaN  NaN
44    5  2.0  3.0
55    1  NaN  NaN
55    2  NaN  NaN
55    3  NaN  NaN
55    4  4.0  5.0
55    5  6.0  7.0

推荐方式:

使用:

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

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

希望有所帮助!