Java在处理mybatis查询timestamp类型字段时的坑

timestamp字段通过sql查询时数据格式是这样的

例:2021-10-13 16:31:29.000

而到了Java这边数据格式却发生变化了

例:2021-10-13T08:31:29.000+0000

chatGPT给出的解释为:

“这是由于时区的差异导致的。在数据库中,timestamp类型的字段以特定格式存储,例如 “2021-10-13 16:31:29.000”。当将该字段检索到Java中时,JDBC驱动程序会将其转换为Java中的java.sql.Timestamp对象。

Java中的java.sql.Timestamp对象在默认情况下会按照ISO 8601标准进行格式化,包含日期、时间和时区信息。因此,当你在Java中打印该对象时,它会显示为 “2021-10-13T08:31:29.000+0000”,其中 “T” 是日期和时间的分隔符,“+0000” 表示偏移量为0的协调世界时(UTC)时区。”

所以“2021-10-13T08:31:29.000+0000”的时间格式并不是所期待的,处理起来有很多麻烦,比如时间少了八个小时;使用SimpleDateFormat类格式化时报错等。

解决方案:应在sql查询时,将timestamp类型转化为想要的格式并以字符串的类型输出,然后到Java侧再使用SimpleDateFormat类进行格式化转换

例:to_char(time::timestamp(3),'YYYY-MM-DD HH24:MI:SS.ms') as time

其中

time::timestamp(3)的作用是:将 time数据类型的值转换为 timestamp数据类型,并且保留 3 位小数的毫秒精度。

YYYY-MM-DD HH24:MI:SS.ms 是一个表示日期和时间的格式化字符串模板,它指定了日期和时间的具体部分。

具体说明如下:

  • YYYY:表示四位数的年份,例如 2023。
  • MM:表示月份,范围从 01 到 12。
  • DD :表示月份中的日期,范围从 01 到 31。
  • HH24:表示 24 小时制的小时,范围从 00 到 23。
  • MI:表示分钟,范围从 00 到 59。
  • SS:表示秒钟,范围从 00 到 59。
  • .ms :表示毫秒部分,使用小数点和 ms 表示,范围从 000 到 999。

这样一来,问题得以解决,慎用timestamp,坑太大

你可能感兴趣的:(mybatis)