java 修改时区_JAVA代码中时区设置

问题:

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  ,返回格式如图圈:

2886faf4354233bacf19809ab050777d.png

问题排查:

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,则使用指定的时区;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值