Java 春季休眠不必要的时区调整
我有一个简单的服务,它将日期作为字符串(以及其他字段)输入,并将其保存到mySql数据库中。我正在使用带Hibernate的Spring Boot。 如果我用Java 春季休眠不必要的时区调整,java,mysql,spring,hibernate,date,Java,Mysql,Spring,Hibernate,Date,我有一个简单的服务,它将日期作为字符串(以及其他字段)输入,并将其保存到mySql数据库中。我正在使用带Hibernate的Spring Boot。 如果我用{“expenseDate”:“04/02/2017”}发布JSON,则在jackson映射之后捕获的日期是“2017-04-01 19:00:00” 顺便说一句,如果我查看数据库中的行,日期是“2017-04-02”,正如我预期的那样。当我查询服务时,json中返回的日期是正确的,但是当我从数据库中转储行时,它们都返回正确的日期减去6小时
{“expenseDate”:“04/02/2017”}
发布JSON,则在jackson映射之后捕获的日期是“2017-04-01 19:00:00”
顺便说一句,如果我查看数据库中的行,日期是“2017-04-02”,正如我预期的那样。当我查询服务时,json中返回的日期是正确的,但是当我从数据库中转储行时,它们都返回正确的日期减去6小时
我住在中央时区,所以我猜数据库中的日期是UTC,Spring因为在中央时区而休假六个小时
控制器:
@PostMapping("/expenses")
public ResponseEntity<Expense> submitExpense(@RequestBody Expense expense) throws BadHttpRequest {
expenseService.saveExpense(expense);
return new ResponseEntity<>(expense, HttpStatus.CREATED);
}
我在日期字段上尝试了@JsonFormat(pattern=“MM/dd/yyyy”,timezone=“UTC”)
,但没有任何改变
我还尝试使用日期部分从视图构造日期,并将其作为一个长的向下传递给服务,但结果是相同的。很明显,我错过了一些极其重要的,很可能是简单的东西
有什么想法吗 您可能需要放置一个名为serverTimezone的数据库连接url参数。您可能需要放置一个名为serverTimezone的数据库连接url参数。您应该将“时区”设置为您期望传入日期所在的任何时区
public class Data {
@JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00")
Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public class Main {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class);
System.out.println(data.date);
}
}
输出
2017年4月2日星期日美国东部时间00:00:00
// I am located in EDT
如果我假设传入日期是UTC
@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC")
Date date;
输出
美国东部时间2017年4月1日星期六20:00:00
// I am located in EDT
默认情况下,它似乎将日期视为UTC。在你的情况下,如果你在CST中,你应该考虑设置中央时间时区(我相信<强>美国/中心< /强>)。p>
注意
如果您的日期输入可以来自不同时区的客户,这将是另一个讨论。您很可能需要定义一个合同,客户机在特定时区中输入日期,或者明确指定一个时区作为附加输入,或者让您的客户机端(如果存在)执行到服务器端期望的特定时区的转换。您应该设置“时区”到达您希望到达的日期所在的任何时区
public class Data {
@JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00")
Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public class Main {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class);
System.out.println(data.date);
}
}
输出
2017年4月2日星期日美国东部时间00:00:00
// I am located in EDT
如果我假设传入日期是UTC
@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC")
Date date;
输出
美国东部时间2017年4月1日星期六20:00:00
// I am located in EDT
默认情况下,它似乎将日期视为UTC。在你的情况下,如果你在CST中,你应该考虑设置中央时间时区(我相信<强>美国/中心< /强>)。p>
注意
如果您的日期输入可以来自不同时区的客户,这将是另一个讨论。您很可能需要定义一个合同,客户机在特定时区输入日期,或明确指定一个时区作为附加输入,或让您的客户端(如果存在)转换到服务器端期望的特定时区。当您在JSON输入中通过2017年2月4日时,那个日期应该在哪个时区?您的服务的使用者是否应该以UTC传递日期?我可能有点天真,但我只会假设该日期的值而不做任何修改,因此截断的日期将具有传递的值。这正是它在数据库中的样子,所以看起来我所做的是正确的,除了没有正确的相加,当我截取对象时,实际值是关闭的,当您在JSON输入中通过2017年2月4日时,该日期应该在哪个时区?您的服务的使用者是否应该以UTC传递日期?我可能有点天真,但我只会假设该日期的值而不做任何修改,因此截断的日期将具有传递的值。这正是它在数据库中看起来的样子,所以看起来我所做的是正确的,除了没有什么加起来正确,当我截取对象时,实际值为off这是问题的一部分-我在db url上设置了UTC属性-我需要将其更改为我的本地时区。如果我让它单独使用数据库的默认值,让spring使用默认值,那就好了。谢谢这是问题的一部分-我将db url上的属性设置为UTC-我需要将其更改为我的本地时区。如果我让它单独使用数据库的默认值,让spring使用默认值,那就好了。谢谢这是一个很大的帮助-结合下面的答案。我已经在db connection属性和实体的jsonformat上将时区设置为UTC-将其更改为我的本地时区解决了这个问题。如果我没有设置db参数,让spring使用默认的时区,这一切都会发生。这是一个很大的帮助-结合下面的答案。我已经在db connection属性和实体的jsonformat上将时区设置为UTC-将其更改为我的本地时区解决了这个问题。现在一切都在敲响警钟,如果我没有设置db参数并让spring使用默认时区,这就不会发生