gpt4 book ai didi

mysql - 保存到 mySQL 数据库时如何阻止 LocalDate 更改

转载 作者:IT老高 更新时间:2023-10-29 00:17:46 27 4
gpt4 key购买 nike

使用 JPA CriteriaBuilder API 将 LocalDate 字段(例如 '2017-09-27')保存到 mySQL Date 列时,结果不同(例如 '2017 -09-26').

我已经使用 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) 验证我的数据库的时区设置为 UTC,结果是“00:00:00”。

我在本地测试这个,我的时区是 GMT + 2,所以我怀疑当从 ​​LocalDateDate 的转换发生时,2 小时是被扣除并产生请求日期前 1 天的日期(假设 LocalDate 字段,由于它有没有时间信息,被视为 00:00 :00.

在这种情况下保存 LocalDates 的最佳方法是什么?我应该听从这里的建议吗 https://stackoverflow.com/a/29751575/3832047并将所有 LocalDate 字段明确设置为 UTC 或类似的东西?

我运行了一个测试,看看在代码中转换它们时会发生什么,并得到以下结果:

Date convertedDate = Date.valueOf(localDate);

conversion-result

编辑

这是我用来检索数据的代码示例,其中也发生了奇怪的日期更改。如果我请求 2017-06-27 的数据,我会收到 2017-06-26 的结果。

CriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HorseAndTrailerRequest.class);
Root<HorseAndTrailerRequest> criteria = criteriaQuery.from(HorseAndTrailerRequest.class);

ParameterExpression<LocalDate> effectiveDateParameter = criteriaBuilder.parameter(LocalDate.class);
criteriaQuery.select(criteria)
.where(
criteriaBuilder.equal(criteria.get("effectiveDate"), effectiveDateParameter)
);

TypedQuery<HorseAndTrailerRequest> query = sessionFactory.getCurrentSession().createQuery(criteriaQuery);
query.setParameter(effectiveDateParameter, date);
return query.getResultList();

最佳答案

由于 LocalDate 没有时区,您可以将 column_date 映射到数据库模式中,并使用 AttributeConverterLocalDate 转换为 long避免时区转换问题:

import javax.persistence.Converter;
import java.time.LocalDate;
import javax.persistence.AttributeConverter;
@Converter
public class LocalDateToLong implements AttributeConverter<LocalDate, Long> {

@Override
public Long convertToDatabaseColumn(LocalDate date) {
if (date != null) {
long epochDay = date.toEpochDay();
return epochDay;
}
return null;
}

@Override
public LocalDate convertToEntityAttribute(Long epochDay) {
// TODO Auto-generated method stub
if (epochDay != null) {
LocalDate date = LocalDate.ofEpochDay(epochDay);
return date;
}
return null;
}

}

关于mysql - 保存到 mySQL 数据库时如何阻止 LocalDate 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46446598/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com