gpt4 book ai didi

Java:如何在不进行时区转换的情况下将日期保存到MySQL中?

转载 作者:行者123 更新时间:2023-12-01 18:22:39 25 4
gpt4 key购买 nike

我正在用Java8 + MyBatis + MySQL5.7保存一个生日。我的代码是这样的:

// 'birthday' is a DATE column
@Insert("insert into MyTable (id, birthday) values (#{id"}, #{date})")
void saveDate(int id, LocalDate date);

@Select("select birthday from MyTable where id=#{id"}")
LocalDate loadDate(@Param("id") int id);

以及保存和加载日期的代码。

final int id = 1;
final LocalDate date = LocalDate.of(2020, 1, 3);

repo.saveDate(id, date);
LocalDate dateFromDB = repo.loadDate(id);

System.out.println(date); // 2020-1-3
System.out.println(dateFromDB); // 2020-1-2

我注意到“dateFromDB”的值总是在“date”之前一天。我认为这是由时区转换引起的。由于我的应用程序使用 UTC+8,而 DB 使用 UTC。通过使用 DATETIME 而不是 DATE,我可以看到日期“2020-1-3”保存为“2020-1-2 16:0:0”。

所以问题是在保存生日等日期时如何避免时区转换?

-----------------更新于2020-02-20 ------------------------ ------------

到目前为止,我找到了 4 种方法:

  1. 添加参数noTzConversionForDateType=true以避免仅针对日期类型进行转换。这是最好的方法,但它仅适用于版本 5.1。我真的不明白为什么它从8.0版本中被删除...( document )
  2. 添加参数serverTimezone=GMT%2B8使用客户端时区(UTC+8)作为服务器时区。转换仍然发生,但没有任何改变。问题是 TIMESTAMP 列也会受到影响。
  3. 向 JVM 添加参数 -Duser.timezone=UTC。该问题与#2 类似。
  4. LocalDate 值作为 String 发送。更新 saveDate 函数如下(仅将类型从 LocalDate 更改为 String):
@Insert("insert into MyTable (id, birthday) values (#{id"}, #{date})")
void saveDate(int id, String date);

然后在调用 saveDate 之前将日期转换为 String:

String dateString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
repo.saveDate(id, dateString);

请注意,DB 中的数据类型仍然是DATE。这种方式的好处是只有birthday列会受到影响。问题是代码不够优雅,对于大数据集可能会导致性能问题。

最佳答案

假设您使用如下连接字符串连接到 MySQL

jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=YOUR_TZ

应该为你做一些转换

关于Java:如何在不进行时区转换的情况下将日期保存到MySQL中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277980/

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