Java
java程序会取系统默认时区作为Date运算的时区。如果不想跟着系统时区走,可以
-Duser.timezone=GMT #JVM启动时区
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); #写在main函数的第一行
前端传过来的字符串如果不带时区信息,比如2019-07-11,java会认为是当前时区的2019-07-11 00:00:00。
所以要求字符串必须带时区信息,否则解析出来就会有时区差。
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-ddZ");
System.out.println(df.getTimeZone());
Date date = df.parse("2019-07-11+0000");
System.out.println(date);
df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
System.out.println(df.format(date));
执行的结果
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
Thu Jul 11 08:00:00 CST 2019
2019-07-11T08:00:00+0800
Java to mysql
Java侧:2019-05-05 UTC+0时区
spring jdbc配置:serverTimezone=GMT%2B8 即+8时区
Mybatis侧
f.`gmt_create` between #{timeStart,jdbcType=TIMESTAMP} and #{timeEnd,jdbcType=TIMESTAMP}
mysql 侧 +8时区
f.`gmt_create` between '2019-05-05 08:00:00.0' and '2019-05-08 07:59:59.999'
当修改jdbc配置:serverTimezone=GMT时
f.`gmt_create` between '2019-05-05 00:00:00.0' and '2019-05-07 23:59:59.999'
总结:spring会将自己的时区根据jdbc的配置,转换成相应时区的字符串。
网友评论