技术分享 | MySQL:一文弄懂时区&time_zone

警察故事52023-05-09  44

你还在被以下问题困扰吗:

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 一起使用。

国时间一般被认为是美国本土的时间。美国本土横跨西五区至西八区,共四个时区,每个时区对应一个标准时间。从东向西分别为东部时间(EST)(西五区时间)、中部时间(CST)(西六区时间)、山地时间(MST)(西七区时间)、太平洋时间(西部时间)(PST)(西八区时间)。[阿拉斯加时间(AKST)(西九区时间)和夏威夷时间(HST)(西十区时间)]按照“东早西晚”的规律,各递减一小时。美国从每年3月的第二个星期日至11月的第一个星期日采用夏令时,夏令时比正常时间快一小时。

具体分为以下几个时区:

太平洋时区:代表城市洛杉矶

山地时区:代表城市盐湖城

中部时区:代表城市芝加哥

东部时区:代表城市纽约、华盛顿

夏威夷时区:代表城市:火奴鲁鲁

阿拉斯加时区:代表城市:费尔班克斯

cst是中国时间,而且还是美国、澳大利亚、古巴或中国的标准时间。CST英语全称为CentralStandardTime(USA)、CentralStandardTime(Australia)、ChinaStandardTime或CubaStandardTime等四个地方。具体如下:

1、美国中部时间:CentralStandardTime(USA)UT-6:00。

2、澳大利亚中部时间:CentralStandardTime(Australia)UT+9:30。

3、中国标准时间:ChinaStandardTimeUT+8:00。

4、古巴标准时间:CubaStandardTimeUT-4:00。

美国时间并不统一,各州使用各州对应区时时间。

美国本土横跨西五区至西八区,共四个时区,每个时区对应一个标准时间。从东向西分别为东部时间(EST)(西五区时间)、中部时间(CST)(西六区时间)、山地时间(MST)(西七区时间)、太平洋时间(西部时间)(PST)(西八区时间)。[阿拉斯加时间(AKST)(西九区时间)和夏威夷时间(HST)(西十区时间)]按照"东早西晚"的规律,各递减一小时。

美国的时区界限并不完全按照经线划分,基本上照顾了各州的自然边界。不同的时区覆盖的州市大小、多少不同。

美国,不以美国首都华盛顿特区时间为准,而是把自东海岸至西海岸4517公里的地段(美国本土),划分为四个时区。

一、东部时区——EASTERN TIME(ET) 华盛顿特区、纽约、波士顿、亚特兰大、费城、迈阿密等在此时区北京时间为东部时间加十三个小时。

二、中部时区——CENTRAL TIME(CT) 芝加哥、圣路易斯、新奥尔良、休斯顿等在此时区北京时间为中部时间加十四个小时。

三、山地时区——MOUNTAIN TIME(MT) 丹佛、凤凰城、盐湖城等在此时区北京时间为山地时间加十五个小时。

四、太平洋时区——CENTRAL TIME(CT) 洛杉矶、旧金山、圣地亚哥、拉斯维加斯、西雅图等在此时区北京时间为太平洋时间加十六个小时 另外,夏威夷和阿拉斯加为第五时区,太平洋时间减两个小时即为夏威夷和阿拉斯加时间。

参考资料:

美国时间(美国时间)_百度百科

CST是美国中部标准时间,SAT是智利时间,我顺便把所有时区的缩写附在下面给你吧

希望能够帮到你 :D

IDLW -1200 International Date Line West

NT -1100 Nome

HST -1000 Hawaii Standard

CAT -1000 Central Alaska

AHST -1000 Alaska-Hawaii Standard

AKST -0900 Alaska Standard

YST -0900 Yukon Standard

HDT -0900 Hawaii Daylight

AKDT -0800 Alaska Daylight

YDT -0800 Yukon Daylight

PST -0800 Pacific Standard

PDT -0700 Pacific Daylight

MST -0700 Mountain Standard

MDT -0600 Mountain Daylight

CST -0600 Central Standard

CDT -0500 Central Daylight

EST -0500 Eastern Standard

ACT -0500 Brazil, Acre

SAT -0400 Chile

BOT -0400 Bolivia

EDT -0400 Eastern Daylight

AST -0400 Atlantic Standard

AMT -0400 Brazil, Amazon

ACST -0400 Brazil, Acre Daylight

NST -0330 Newfoundland Standard (also: North Sumatra +0630)

NFT -0330 Newfoundland

GST -0300 Greenland Standard (also: Guam Standard +1000)

BST -0300 Brazil Standard (also: British Summer +0100)

BRST -0300 Brazil Standard

BRT -0300 Brazil Standard

AMST -0300 Brazil, Amazon Daylight

ADT -0300 Atlantic Daylight

ART -0300 Argentina

NDT -0230 Newfoundland Daylight

AT -0200 Azores

BRST -0200 Brazil Daylight (official time)

FNT -0200 Brazil, Fernando de Noronha

WAT -0100 West Africa

FNST -0100 Brazil, Fernando de Noronha Daylight

GMT +0000 Greenwich Mean

UT +0000 Universal (Coordinated)

UTC +0000 Universal (Coordinated)

WET +0000 Western European

CET +0100 Central European

FWT +0100 French Winter

MET +0100 Middle European

MEZ +0100 Middle European

MEWT +0100 Middle European Winter

SWT +0100 Swedish Winter

BST +0100 British Summer (also: Brazil standard -0300)

GB +0100 GMT with daylight savings

WEST +0000 Western European Daylight

CEST +0200 Central European Summer

EET +0200 Eastern Europe, USSR Zone 1

FST +0200 French Summer

MEST +0200 Middle European Summer

MESZ +0200 Middle European Summer

METDST +0200 An alias for MEST used by HP-UX

SAST +0200 South African Standard

SST +0200 Swedish Summer (also: South Sumatra +0700)

EEST +0300 Eastern Europe Summer

BT +0300 Baghdad, USSR Zone 2

MSK +0300 Moscow

EAT +0300 East Africa

IT +0330 Iran

ZP4 +0400 USSR Zone 3

MSD +0300 Moscow Daylight

ZP5 +0500 USSR Zone 4

IST +0530 Indian Standard

ZP6 +0600 USSR Zone 5

NOVST +0600 Novosibirsk time zone, Russia

NST +0630 North Sumatra (also Newfoundland Std -0330)

SST +0700 South Sumatra, USSR Zone 6 (also: Swedish Summer +0200)

JAVT +0700 Java

CCT +0800 China Coast, USSR Zone 7

AWST +0800 Australian Western Standard

WST +0800 West Australian Standard

PHT +0800 Asia Manila

JST +0900 Japan Standard, USSR Zone 8

ROK +0900 Republic of Korea

ACST +0930 Australian Central Standard

CAST +0930 Central Australian Standard

AEST +1000 Australian Eastern Standard

EAST +1000 Eastern Australian Standard

GST +1000 Guam Standard, USSR Zone 9 (also: Greenland Std -0300)

ACDT +1030 Australian Central Daylight

CADT +1030 Central Australian Daylight

AEDT +1100 Australian Eastern Daylight

EADT +1100 Eastern Australian Daylight

IDLE +1200 International Date Line East

NZST +1200 New Zealand Standard

NZT +1200 New Zealand

NZDT +1300 New Zealand Daylight

以上就是关于技术分享 | MySQL:一文弄懂时区&time_zone全部的内容,包括:技术分享 | MySQL:一文弄懂时区&time_zone、美国时间是哪个时区、cst是中国时间嘛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

转载请注明原文地址:https://juke.outofmemory.cn/read/3861075.html

最新回复(0)