问题:

Java代码返回的DateTime时间和单独截取时间不一致。

 

DateTime设置方法:

DateTimeFormatter format = DateTimeFormat.forPattern("yyyyMMdd");//.withZone(DateTimeZone.forOffsetHours(0));       
        DateTime startDate = DateTime.parse("20200101", format);    
         log.debug("shuqu:{}",startDate.getZone());
        DateTime endDt = startDate.plusMonths(1).minusSeconds(1);

无论从数据库还是参数设置,时间都在原来的基础上GMT+8.

例如原格式为:2019-12-25 10:00:00  ,返回格式如图圈:

java怎么修改服务器时间 java设置时区_Java

 

 

 

问题排查:

1. 数据库中插入一条数据,创建时间 now() 和当前系统时间相同

2. 通过Java不经过任何时间函数,数据库中获取一条数据,时间和数据库中相同

3. 代码逐步调试,joda.time.DateTimeFormat会自动加上时区, 这个时区可能有JVM或者当前系统时区决定

4. 修改本机系统的时区即右下角时钟时区(非GMT+8),joda.time.DateTimeFormat依旧会加上当前时区(GMT+8)。

5. 修改eclise的jre时区,重启调试。在你的eclipse/MyEclipse的JVM的jre运行参数中设置时区。在Default VM Arguments中设置:-Duser.timezone=GMT+2, joda.time.DateTimeFormat显示当前时区(GMT+2)

 

结论:

Java中时区由JVM时区决定,为了不影响参数和从DB中取到的时间,在DateTimeFormatter format = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZone.forOffsetHours(0));      加上时区设置,时区0.

 

 

jvm在读取linux的系统时区时:

如果存在环境变量TZ,则jvm最优先读取环境变量TZ中的内容;

如果不存在环境变量TZ,会读取/etc/sysconfig/clock文件中的ZONE内容(需要引号);

若都不存在,则读取使用/etc/localtime文件内容所对应的时区。

如果设置了-Duser.timezone,则使用指定的时区;