Springboot在1天之内将日期保存到数据库中

时间:2019-04-06 13:04:19

标签: java mysql hibernate spring-boot jvm

问题

我正在使用SpringBoot使用休眠模式将应用程序编写数据写入MySQL数据库。我使用thymeleaf从HTML表单获取实体的数据。 当我将记录保存到数据库时,它们落后1天,因此2019-04-09变为2019-04-08。

到目前为止有什么作用

到目前为止,我发现的唯一解决此问题的方法是将系统时间更改为UTC时间,但是显然,无论我为谁编写应用程序,这都将以不同的方式工作。我在互联网上看到过很多与此相关的主题,但是大多数情况下,它是使用JVM hacks修复的,如果可能的话,我想以一种适当的方式来实现。

什么让我感到困惑

我正在使用java.time.LocalDate,据说它不使用时区,它会将这个日期保存到类型为“ Date”的SQL数据库列中。我尝试将数据库时区更改为UTC,但这似乎没有什么不同。唯一不同的是将Windows时间更改为UTC。

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=UTC
spring.datasource.username=box
spring.datasource.password=box
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

休眠实体

@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "dataUmowy")
private LocalDate dataUmowy;

控制器

@SessionAttributes("ofwca")
@Controller
public class OfwcaController {

@Autowired
private OfwcaDao ofwcaDao;

@RequestMapping(value = "/panelOfwca/daneOfwca", method = RequestMethod.POST)
public String daneOfwca(Model model, @ModelAttribute("ofwca") Ofwca ofwca){

    ofwcaDao.save(ofwca);

    model.addAttribute("title", "Dane " + ofwca.getImie() + " " + ofwca.getNazwisko());
    model.addAttribute("ofwca", ofwca);
    return "panelOfwca/daneOfwca";
}

数据访问对象

@Transactional
@Repository
public interface OfwcaDao extends CrudRepository<Ofwca, Integer> {

public List<Ofwca> findAll();

public Ofwca findByIdOfwca(Integer idOfwca);

}

html表单

<form role="form" method="post" th:action="@{/panelOfwca/daneOfwca}" th:object="${ofwca}">

  <div class="form-group col-xs-4">
    <label for="dataUmowy">Data umowy</label>
    <input type="date" id="dataUmowy" th:field="*{dataUmowy}" class="form-control">
  </div>
</form>

3 个答案:

答案 0 :(得分:2)

您的jdbc网址出现此问题:

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=UTC

您必须按以下方式更改jdbc连接URL:

spring.datasource.url=jdbc:mysql://localhost:3306/boxbaza?serverTimezone=Europe/Berlin

我已经解决了滞后1天的问题,并进行了上述替换。

答案 1 :(得分:1)

尽管我已经很长时间没有使用过Hibernate(尤其是其中的java.time),但是您的问题与您的MySQL服务器期望使用UTC时区和本地服务器的“日期”这一事实有关在Europe/Berlin时区(至少(是)UTC + 1)中运行。 也就是说,任何日期,例如我想将2019-08-04保存为一天的前一天(例如2019-07-04),这是因为时区之间存在1-2小时的差异。

在大多数情况下,默认情况下,最好将所有不带时区的日期/时间值都视为具有UTC时区。 如果那不可能,那么您应该调整数据库设置以使用与Java应用程序相同的时区。

更多读数:

答案 2 :(得分:0)

我现在通过使用不同的时区(本地服务器所在的时区)来解决我的问题,但是我不确定将来将应用程序部署到云时它将如何工作。可能不得不再次基于Web服务器更改参数。

serverTimezone=Europe/Berlin