问题描述:
有个业务需求,统计某个时间点之前数据库中的数据,不传时间的话就统计所有,接口写完之后做了两个测试,分别是不传时间和传当天晚上23:00的时间,当天晚上23:00属于未来时间,两次统计的记录数应该是一样的才对,可事实是两者不一致。
传23:00的时间的统计数据每次统计的结果是一样的,比不传时间统计的数据要少,不传时间每次统计的数据都是不一样的,因为数据库的数据一直在变,所以23:00的时间统计的一直是某个历史时间的数据,因为统计结果每次都一样,当时下意识看了下时间,是17点多,而公司的业务除了国内还有美国,数据时不时的有时区问题,第一直觉是时区问题,就以15:00作为参数,直接用sql统计了一下数据库的数据,果然跟通过postman传23:00的统计结果是一致的。
如果是时区问题,那到底是哪里出问题了呢?本机是Shanghai,服务器上通过date -R查看也是东八区,Java不应该默认使用的本机时区吗?打开MySQL的日志收集,查看sql,虽然postman传的23:00,数据库日志打印的确实是15:00。
解决方案:
问题确实是时区问题,jvm默认确实是使用的本机时区设置,但,不是通过date -R查看。JVM默认获取的Centos和Ubuntu的时区是文件/etc/localtime的时区。通过以下命令查看:
#ls -l /etc/localtime