1.之前做了一个登录检测的功能,就是每次用户登录会记录用户登录时间和在线时常。最近测试发现数据混乱,登录时间是对的,但是退出时间不对。经过排查,是apache2服务器崩了,所以重启了apache2服务器,时间就正常了。
2.在解决问题的过程中,整理一下,如何正常使用这个时间,虽然apache2 系统 和 mysql里的时间之间的关系不太清楚。但是知道的是,mysql时间是根据系统(linux)来获取的,现在我们来看一下:
(1) 首先设置好linux服务器的时区和时间:用date命令看一下:
Wed Oct 21 15:26:17 CST 2015 发现是CST,这个是中国标准时间(China Standard Time) 有的可能是EDT( 美国东部夏季时间) 这个就要进行修改:
方法如下:(网上摘抄的感谢作者)
linux系统修改CST时区:
=================================================
(2)修改完成后,重启apahce2服务器,让修改的时间也在apache2中生效。因为插入时间进数据库的时候我们利用了date函数来获取时间,而php获取的时间就是apache的时间
(3) 重启mysql服务器。
我们已经说了mysql服务器里边的时间根据linux系统时间来判断的,我们可以用show variables like "%time_zone";语句来看一下:
如下:
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
我们可以看到系统的时区是CST和linux系统的时间是一样的,mysql当前的时区 显示为SYSTEM 也就是和服务器的时区是一样的,也是linux下的。这样就做到了一致。
如果修改了time_zone字段,会影响到select now(); 若使用上述默认的SYSTEM时区 ,我们在数据库里select now();时间就是linux服务器下date命令后的时间。
若是用SQL命令 把time_zone设置为 set time_zone = "+8:00"或者其他的 则select now();会在linux服务器date命令下的时间的基础上进行+8个小时操作。
注意:PHP中date方法中可以由参数设置是12小时制还是24小时制,date('Y-m-d H:i:s',time());
- h - 带有首位零的 12 小时小时格式
- H 是表示24小时格式
- i - 带有首位零的分钟
- s - 带有首位零的秒(00 -59)
- a - 小写的午前和午后(am 或 pm)