我在使用@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
注释或指示格式化程序是否宽松?
答案 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值。以下是相关注释的文档:
简单地说,这里是所需的类型: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;
希望有所帮助!