参考:
http://www.99cankao.com/date/timezone.php
由于由于工作中经常要采集来自不同国家网站的数据,和来自不同时区的同事月会议,开发程序,所以经常在时区上转不过弯来,这里整理了一下,做个笔记,也希望对大家有所帮助。
时区的定义
1884年在华盛顿召开的国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。
-
GMT
格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich Mean
Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。
由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。 -
UTC
协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps
Universel Coordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。UTC是基于原子物理学的特性,将在海平面上实现的“原子时秒”定义为国际标准时的时间单位,而原子时秒是这样定义的:铯-133 原子基态的两个超精细能级间在零磁场下跃迁辐射9192631770周所持续的时间 。所以,协调世界时属于“原子物理时间”,它更加精确,基本不会产生误差。 -
UNIX 时间戳
计算机中的UNIX时间戳,是以GMT/UTC时间「1970-01-01T00:00:00」为起点,到具体时间的秒数,不考虑闰秒。这么做当然是为了简化计算机对时间操作的复杂度。
-
冬令时,夏令时
地球自转方向从西向东,所以东边更早看到新一天的太阳。各地区在时区概念的基础上,时间更接近于太阳时(最简单的理解就是太阳直射时,当地时间基本接近12点)。昼夜长短会随着四季变换,出于减少能源消耗的目的,提出了冬令时、夏令时的概念。在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
冬令时通常代表使用当地的标准时间,夏令时实施期间时钟拨快一小时,相当于时区往前(东)进一个。
每年会对时间进行两次调整,如下图所示:
常用城市的时区
城市 | UTC 时区 | 说明 |
---|---|---|
Hawaii | -10 | HAST (Hawaii-Aleutian Standard Time) |
Alaska | -9 | (西九区时间)阿拉斯加时间(AKST) |
San Francisco | -8 | 太平洋时间 (美国 &加拿大)PST, 蒂华纳,圣何塞,硅谷 |
Los Angeles | -7 | (西七区时间),山地时间MT,加利福尼亚州西南部 |
Toronto | -5 | 古巴夏令时CDT,东部时间EDT (美国 &加拿大),纽约,华盛顿,迈阿密,渥太华 |
London | 0 | (西欧时间),格林威治标准时间: 都柏林, 爱丁堡, 伦敦, 里斯本卡,萨布兰卡 |
Amsterdam | +1 | 阿姆斯特丹, 柏林, 罗马, 斯德哥尔摩, 维也纳,哥本哈根, 马德里,中非西部,Aarhus |
Athens | +2 | 耶路撒冷,开罗,,贝鲁特,伊斯坦布尔,明斯克,南非 |
北京 | +8 | China standard time 缩写CST,马来西亚标准时间MST,吉隆坡, 新加坡 |
Seoul | +9 | 大阪, 扎幌, 东京 |
Sydney | +10 | 堪培拉, 墨尔本,关岛, 莫尔兹比港口 |
常见的应用
-
Java 中时间的转换
在实际开发过程中经常会遇到将Date类型的数据转换为String 类型或将String 类型的日期转换成Date类型的问题。下面就介绍一下如何将String类型的GMT、GST日期转换成Date对象。
JDK中提供了SimpleDateFormat类来实现String类型的日期和Date对象之间的互转。字母 日期或时间元素 类型 示例 G Era 标志符 Text AD y 年份 Number 1996; 96 M 年份中的月份 Text July; Jul; 07 w 年份中的周数 Number 27 W 月份中的周数 Number 2 D 年份中的天数 Number 189 d 月份中的天数 Number 10 F 月份中的星期 Number 2 E 星期中的天数 Text Tuesday; Tue a Am/pm 标记 Text PM H 一天中的小时数(0-23) Number 0 k 一天中的小时数(1-24) Number 24 K am/pm 中的小时数(0-11) Number 0 h am/pm 中的小时数(1-12) Number 12 m 小时中的分钟数 Number 30 s 分钟中的秒数 Number 55 S 毫秒数 Number 978 z 时区 General time zone Pacific Standard Time; PST; GMT-08:00 Z 时区 RFC 822 time zone -0800 // GMT 时间转换 // 字符串转Date String stringDate = "Thu Oct 16 07:13:48 GMT 2015"; SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM ddHH:mm:ss 'GMT' yyyy",Locale.US); Date date =sdf.parse(stringDate); System.out.println(date.toString()); //Date转字符串 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date())); //格式化时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); String time = sdf.format(new Date()); System.out.println(time); //解析时间 2016-01-05T15:06:58+0800 Date date = sdf.parse(time); System.out.println(date); //T代表后面跟着时间,Z代表UTC统一时间 //格式化时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); String time = sdf.format(new Date()); System.out.println(time); //解析时间 2016-01-05T15:09:54Z Date date = sdf.parse(time); System.out.println(date);
-
Python中时间的转换
from pytz import utc
from pytz import timezone
from datetime import datetime
cst_tz = timezone('Asia/Shanghai')
utc_tz = timezone('UTC')
now = datetime.now().replace(tzinfo=cst_tz)
#local_dt = cst_tz.localize(now, is_dst=None)
utctime = now.astimezone(utc)
print "now : %s"%now
print "format: %s"%now.strftime('%Y-%m-%d %H:%M:%S')
print "utc : %s"%utctime
utcnow = datetime.utcnow()
utcnow = utcnow.replace(tzinfo=utc_tz)
china = utcnow.astimezone(cst_tz)
print "utcnow: %s"%utcnow
print "format: %s"%utcnow.strftime('%Y-%m-%d %H:%M:%S')
print "china : %s"%china
-
Hive SQL中时间的转换
Hive SQL 中需要先转化成Unix时间戳,再进行转换成目标时区。这里给出一些样例,其中的问题希望大家自己去深究。
spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27T23:31:55.453', 'UTC-5'),'Toronto'); 2019-01-27 23:31:55.453 Time taken: 0.417 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27 23:31:55.453', 'UTC-5'),'Toronto'); 2019-01-27 23:31:55.453 Time taken: 0.249 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27 23:31:55.453', 'UTC-5'),'UTC-5'); 2019-01-27 23:31:55.453 Time taken: 0.245 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27T23:31:55.453', 'UTC-5'),'America/Toronto'); 2019-01-27 18:31:55.453 Time taken: 0.332 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27 23:31:55.453', 'UTC-5'),'America/Toronto'); 2019-01-27 18:31:55.453 Time taken: 0.249 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( '2019-01-27T23:31:55.453', 'UTC-5'),'UTC-5'); 2019-01-27 23:31:55.453 Time taken: 0.825 seconds, Fetched 1 row(s) spark-sql> desc function to_utc_timestamp; Function: to_utc_timestamp Class: org.apache.spark.sql.catalyst.expressions.ToUTCTimestamp Usage: to_utc_timestamp(timestamp, timezone) - Given a timestamp like '2017-07-14 02:40:00.0', interprets it as a time in the given time zone, and renders that time as a timestamp in UTC. For example, 'GMT+1' would yield '2017-07-14 01:40:00.0'. Time taken: 0.017 seconds, Fetched 3 row(s) spark-sql> desc function from_utc_timestamp; Function: from_utc_timestamp Class: org.apache.spark.sql.catalyst.expressions.FromUTCTimestamp Usage: from_utc_timestamp(timestamp, timezone) - Given a timestamp like '2017-07-14 02:40:00.0', interprets it as a time in UTC, and renders that time as a timestamp in the given time zone. For example, 'GMT+1' would yield '2017-07-14 03:40:00.0'. Time taken: 0.014 seconds, Fetched 3 row(s)
最后分享一个能够将冬令时,夏令时考虑在内的时区转换方式:
from_utc_timestamp( to_utc_timestamp( CAST(event.eventDateTime AS TimeSTamp), ‘GMT-7’),‘America/Toronto’) AS eventDateTimeLocal
-
CAST(event.eventDateTime AS TimeSTamp) 现将时间转换成hive 集群的时间在所在时区,这里GMT-7
-
再通过to_utc_timestamp from_utc_timestamp 来实现时区转换,这样的好处是通过它自带函数将冬令时,夏令时的一个小时误差考虑在内。
-- 一个从别的时区转换到多伦多时区的样例 -- 多伦多在3月中到11月初是夏令时,对应时区为GMT-4,其它时间为GMT-5 spark-sql> select from_utc_timestamp( to_utc_timestamp( CAST('2019-05-21T21:26:30.682-04:00' AS TimeSTamp), 'GMT-7'),'America/Toronto'); 2019-05-21 21:26:30.682 Time taken: 0.37 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( CAST('2019-05-21T21:26:30.682-04:00' AS TimeSTamp), 'GMT-7'),'GMT-5'); 2019-05-21 20:26:30.682 Time taken: 0.327 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( CAST('2019-05-21T21:26:30.682-04:00' AS TimeSTamp), 'GMT-7'),'GMT-4'); 2019-05-21 21:26:30.682 Time taken: 0.45 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( CAST('2019-01-21T21:26:30.682-04:00' AS TimeSTamp), 'GMT-7'),'America/Toronto'); 2019-01-21 20:26:30.682 Time taken: 0.428 seconds, Fetched 1 row(s) spark-sql> select from_utc_timestamp( to_utc_timestamp( CAST('2019-01-21T21:26:30.682-04:00' AS TimeSTamp), 'GMT-7'),'GMT-5'); 2019-01-21 20:26:30.682 Time taken: 0.379 seconds, Fetched 1 row(s)
-
来源:CSDN
作者:Sammion
链接:https://blog.csdn.net/maizi1045/article/details/104051325