首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
mysql datetime格式不正确原因
简介: linux环境中mysql datetime 的时间受系统时区影响,这个BUG不好定位,到底是什么才导致这样的问题因我个人能力问题表示不好说。

      今天发现一个有趣的现象,线上应用系统java插入的时间竟然是 yyyyMMdd hh:mm:ss 格式。

线上系统的环境是:

java项目

mysql数据

Linux操作系统

我创建时间的方法是:new Date(System.currentTimeMillis()),然后把这个值传给了hibernater进行保存。但是就是不能区分插入的时间是上午还是下午让我很纠结。

      刚开始的时候我以为是我方法有问题,然后我在本地创建一个表进行如下测试

本地环境是:

java项目

mysql数据库

win7操作系统

先在本地创建表:

create table dateTest(
a DATETIME
)

再执行插入语句:

insert into dateTest  values(now());

后发现时间是对的执行select语句后发现格式是yyyyMMdd HH:mm:ss (24小时格式),这样说应该就没问题啊,然后我又在本地把代码调试了下还是24的形式没有问题。

 

然后我就想是不是Linux系统上的时间错了,于是我通过SSH连接上去执行命令

#date回车

Sat Jul 27 09:11:30 EDT 2013


看着显示时间刚和我的本地实际对上,那么系统时间应该是对的。

然后我有不死心的在线上系统偷偷的测试了下,还是用的上面的建表脚本和插入语句,查询后的返回结果让我失望,显示的还是yyyyMMdd hh:mm:ss 格式的时间。

 

代码一样就是环境不一样,肯定是哪里出现了问题。

不死心通过vnc连接上Linux忽然发现又上角竟然显示的是AM,不淡定了去你妈的AM现在是晚上9点多了。

 

点击下又上角的时间在弹出的对话框中选择设置,然后一看时区竟然竟然被定位到美国(具体哪个州不记得了,感觉问题找到了有点小激动),直接将时区定位到上海,然后确定,发现时间后面显示的是PM了,然后我在Linux终端又输入

date回车

Sat Jul 27 23:50:10 CST 2013
嘿好像游戏了,返回的数据是24小时的格式,马上执行数据库插入语句,再执行查询语句,唉还是不对,查询到的结果还是yyyyMMdd hh:mm:ss 小时的格式(时间以12小时为一个循环)。

然后就在想我刚才把系统的时区修改了,系统命令DATE 也能正确显示了,那么会不会是mysql在启动的时候就读了那个格式了然后就一直用这个日期格式,没辙了只能重启一下机器了,不过还好今天是周六而且现在已经是深夜了,直接init 6后系统启动成功,然后连接上数据库执行插入sql插入,再查询 得到正确结果,可以安心的睡觉了。

 

问题总结:可能是莫名的原因导致时区数据出现问题,为什么说是时区数据问题?那是因为如果不是时区数据错误的话系统时间是自动获取的,当时我看见时区被定位到美国那么自动获取的时间应该就不会和我本地的实现对应得上才是。

 

心得:不断的测试,不断的问为什么,细心观察才是解决办法的良药。

(不过话说回来如果当时在场的人有人遇到过这个情况的话也不至于浪费了那么多时间,所有我将寻找问题的经过简单的进行了记录希望对看到这篇文章的朋友有所帮助。)