mysql 20小时内,mysql中关于date("Y-m-d H:i:s") 入库慢8小时的解决

原来从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的。每次在插入库时,发现这个registration_date datetime 总是慢了8小时。我试着修改php.ini但一直没有成功。后来修正代码实现了。我这是iis6平台,可能与这个有关系。

经测试:

$timeoffset = 8;

echo gmdate("Y-m-d H:i:s", mktime() + $timeoffset * 3600) . "
";

echo gmdate("Y-m-d H:i:s", time() + $timeoffset * 3600) . "
";

echo date("Y-m-d H:i:s", mktime() + $timeoffset * 3600) . "
";

echo date("Y-m-d H:i:s", time() + $timeoffset * 3600) . "
";

都输出:

2007-11-24 17:41:58

2007-11-24 17:41:58

2007-11-24 17:41:58

2007-11-24 17:41:58

可见,以上几种写法都是正确的,但会有什么区别了,我又研究了一下。区别如下:

date()和gmdate(),在官方的文档中的描述为:

date -- 格式化一个本地时间/日期

gmdate -- 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT)。

可是,我上面输出结果相同,是因为是在win平台下测试的,如果是在Linux+Apache下运行PHP所得的结果会差8小时的。

所以,我们应该给一个兼容性的写法,统一使用gmdate,并手工设置当前时区,写法改进如下:

echo gmdate('Y-m-d H:i:s', time() + 3600 * 8);

这样不管在Linux+Apache下还是Windows下都得到了正确的结果,当然这样写还有一个好处,当网站是面向全世界的时候,那么网站用户只要设置所在的时区,程序自动根据用户设置的时区进行时间计算,数据库中信息发布时间只存当前的time()所生成的时间,那么在中国+8时区看到的发布时间是:2007-03-14 12:15:27,那么在欧洲+2时区用户看到这个信息的发布时间是:2007-11-24 17:41:58,这样信息的时间就全部对应正确了。

另外,int time ( void )返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

mktime -- 取得一个日期的 Unix 时间戳,根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。

int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )

参数

hour

小时数。

minute

分钟数。

second

秒数(一分钟之内)。

month

月份数。

day

天数。

year

年份数,可以是两位或四位数字,0-69 对应于 2000-2069,70-100 对应于 1970-2000。在如今系统中普遍把 time_t 作为一个 32 位有符号整数的情况下,year 的合法范围是 1901 到 2038 之间,不过此限制自 PHP 5.1.0 起已被克服了。

is_dst

本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制。如果未知,PHP 会尝试自己搞明白。这可能产生不可预知(但并非不正确)的结果。如果 PHP 运行的系统中启用了 DST 或者 is_dst 设为 1,某些时间是无效的。例如 DST 自 2:00 生效,则所有处于 2:00 到 3:00 之间的时间都无效,mktime() 会返回一个未定义(通常为负)的值。某些系统(例如 Solaris 8)的 DST 在午夜生效,则 DST 生效当天的 0:30 会被计算为前一天的 23:30

string date ( string format [, int timestamp] )

返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()。

解决系统时间慢8小时完美版「2008-9-26 补充by zhoz」:

ini_set("date.timezone", 'Asia/Shanghai'); // 系统时区

将以上这句放入系统文件中,保证其它文件都能读取,以校正时区。

修改linux的时间可以使用date指令「2008-12-1 补充by zhoz」:

在命令行输入:

date

显示当前时间 11月 27日 10:03:16 CST 2008

date -s

按字符串方式修改时间

可以只修改日期,不修改时间,输入: date -s 2008-11-27

只修改时间,输入:date -s 10:03:00

同时修改日期时间,注意要加双引号,日期与时间之间有一空格,输入:date -s "2008-11-27 10:03:00"

修改完后,记得输入:clock -w

把系统时间写入CMOS

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值