echo date_default_timezone_get();
//将时区设置为中国
date_default_timezone_set("PRC");
你还在被以下问题困扰吗:
MySQL 的安装规范中应该设置什么时区?
JAVA 应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?
已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?
迁移数据时会有导致时间类型数据时区错误的可能吗?
看完这篇文章,你能解决上面所有的疑惑。首先出场的是和时区相关的启动参数和系统变量。
如果要在 MySQL 启动时就指定时区,则应该使用启动参数: default-time-zone ,示例:
启动后我们可以看到控制时区的系统变量,其中 time_zone 变量控制时区,在MySQL运行时可以通过 set 命令修改(注意:不可以写在 mycnf 中):
启动参数和系统变量的可用值遵循相同的格式:
system_time_zone 变量只有全局值没有会话值,不能动态修改,MySQL 启动时,将尝试自动确定服务器的时区,并使用它来设置 system_time_zone 系统变量, 此后该值不变。当 time_zone='system' 时,就是使用的这个时区,示例中 time_zone 就是 CST,而 CST 在 RedHat 上就是东八区:
概括一下就两点:
1 NOW() 和 CURTIME() 系统函数的返回值受当前 session 的时区影响
不仅是select now(),包括insert values(now())、以及字段的 DEFAULT CURRENT_TIMESTAMP 属性也受此影响:
2 timestamp 数据类型字段存储的数据受时区影响
timestamp 数据类型会存储当时session的时区信息,读取时会根据当前 session 的时区进行转换;而 datetime 数据类型插入的是什么值,再读取就是什么值,不受时区影响。也可以理解为已经存储的数据是不会变的,只是 timestamp 类型数据在读取时会根据时区转换:
关于时区所有明面上的东西都在上面了,我们前面提到的困扰就是在暗处的经验。
1 MySQL的安装规范中应该设置什么时区?
对于国内的业务了,在 mycnf 写入 default-time-zone='+08:00' `,其他地区和开发确认取对应时区即可。
为什么不设置为 system 呢?使用系统时间看起来也是个不错的选择,比较省事。不建议的原因有两点:
2 JAVA应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?
这通常是 JDBC 参数中没有为连接设置时区属性(用 serverTimezone 参数指定),并且MySQL中没有设置全局时区,这样MySQL默认使用的是系统时区,即 CST。这样一来应用与MySQL 建立的连接的 session time_zone 为 CST ,前面我们提到 CST 在 RedHat 上是 +08:00 时区,但其实它一共能代表4个时区:
JDBC在解析CST时使用了美国标准时间,这就会导致时区错误。要解决也简单:一是遵守上面刚说到的规范,对MySQL显示的设置'+08:00'时区;二是JDBC设置正确的 serverTimezone。
3 已经运行一段时间的业务,修改MySQL的时区会影响已经存储的时间类型数据吗?
完全不会,只会影响对 timestamp 数据类型的读取。这里不得不提一句,为啥要用 timestamp?用 datetime 不香吗,范围更大,存储空间其实差别很小,赶紧加到开发规范中吧。
4 迁移数据时会有导致时间类型数据时区错误的可能吗?
这个还真有,还是针对 timestamp 数据类型,比如使用 mysqldump 导出 csv 格式的数据,默认这种导出方式会使用 UTC 时区读取 timestamp 类型数据,这意味导入时必须手工设置 sessiontime_zone='+00:00'才能保证时间准确:
如何避免?mysqldump 也提供了一个参数 --skip-tz-utc ,意思就是导出数据的那个连接不设置 UTC 时区,使用 MySQL 的 gloobal time_zone 系统变量值。
其实 mysqldump 导出 sql 文件时默认也是使用 UTC 时区,并且会在导出的 sql 文件头部带有 session time_zone 信息,这样可以保证导 SQL 文件导入和导出时使用相同的时区,从而保证数据的时区正确(而导出的 csv 文件显然不可以携带此信息)。需要注意的是 --compact 参数会去掉 sql 文件的所有头信息,所以一定要记得: --compact 参数得和 --skip-tz-utc 一起使用。
你是Linux?
如果是RHEL/CentOS,在图形界面下可运行:
system-config-date调出日期/时间的应用界面,可以看时区,跟windows下类似。
您好,电脑时间不能同步、电脑时间同步出错、电脑时间不同步、电脑时间同步不了的解决步骤:(小窍门:将日期和时间调整为接近当前,将可以避免电脑时间不能同步或进行同步时出错的问题)
(在开始下面的设置之前,小编建议将“自动与Internet时间服务器同步”下方的服务器更改为IP:2107214544 ,这是中国国家授时站的IP地址,同步成功率为99%)
第一步:校准时区,鼠标双击任务栏右下角时间栏或右键单击时间选择“调整日期/时间”——>在d出的“日期和时间属性”窗口中选择“时区”选项卡——>将时区选择为“(GMT+08:00)北京,重庆,香港特别行政区,乌鲁木齐”——>点击“应用”,不要关闭“时间和日期属性”窗口;
第二步:在“日期和时间属性”窗口中选择“时间和日期”选项卡——>尽量将日期和时间调整为当前日期和时间,尽量接近,否则可能导致提示“链接PRC服务器不可用”的问题——>再选择“Internet 时间”选项卡——>将“自动与Internet时间服务器同步(S)”前面打上勾——>点击“确定”退出;
第三步:点击“开始”菜单——>选择“运行”——>输入“servicesmsc”(不含引号)——>在d出的“服务(本地)”窗口中下拉滑动条,找到“Windows Time”服务——>右键点击“Windows Time”服务,选择“启动”——>关闭“服务(本地)”窗口;
第四步:双击任务栏右下角时间栏——>选择“Internet 时间”选项卡——>点击“立即更新”——>假如仍然提示“进行同步时出错”,可以将服务器更改为“2107214544”(中国国家授时站服务器IP地址)或者点击服务器中的向下箭头,选择“Timenistgov”——>再尝试点击“立即更新
校准时区,鼠标双击任务栏右下角时间栏或右键单击时间选择“调整日期/时间”→在d出的“日期和时间属性”窗口中选择“时区”选项卡→将时区选择为“(GMT+08:00)北京,重庆,香港特别行政区,乌鲁木齐”→点击“应用”,不要关闭“时间和日期属性”窗口。
1、在“日期和时间属性”窗口中选择“时间和日期”选项卡→尽量将日期和时间调整为当前日期和时间,尽量接近,否则可能导致提示“链接PRC服务器不可用”的问题→再选择“Internet 时间”选项卡→将“自动与Internet时间服务器同步(S)”前面打上勾→点击“确定”退出;
2、点击“开始”菜单→选择“运行”→输入“servicesmsc”→在d出的“服务(本地)”窗口中下拉滑动条,找到“Windows Time”服务→右键点击“Windows Time”服务,选择“启动”→关闭“服务(本地)”窗口;
3、双击任务栏右下角时间栏→选择“Internet 时间”选项卡→点击“立即更新”→假如仍然提示“进行同步时出错”,可以将服务器更改为“2107214544”(中国国家授时站服务器IP地址)或者点击服务器中的向下箭头,选择“Timenistgov”→再尝试点击“立即更新”;
、查看和修改Linux的时区1查看当前时区命令:"date-R"2修改设置Linux服务器时区方法A命令:"tzselect"方法B仅限于RedHatLinux和CentOS命令:"timeconfig"方法C适用于Debian命令:"dpkg-reconfiguretzdata"3复制相应的时区文件,替换系统时区文件;或者创建链接文件cp/usr/share/zoneinfo/$主时区/$次时区/etc/localtime例如:在设置中国时区使用亚洲/上海(+8)cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime二、查看和修改Linux的时间1查看时间和日期命令:"date"2设置时间和日期例如:将系统日期设定成2009年11月3日的命令命令:"date-s11/03/2009"将系统时间设定成下午5点55分55秒的命令命令:"date-s17:55:55"3将当前时间和日期写入BIOS,避免重启后失效命令:"hwclock-w"注:date不加参数可以直接看到当前日期时间cal不加参数可以直接看到本月月历欢迎分享,转载请注明来源:内存溢出
评论列表(0条)