每个程序员都用过DateTime,但真正当前后台进行交互时,才发现这里的复杂性。比如这些关健词:
- GMT
- UTC
- CST
- ISO8601
- Unix Timestamp
还有在常见系统中对应的:
- TimeZone
- Local
时区及格式
先从GMT说起吧
(Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林威治天文台的标准时间。 通俗的说,就是将地球按经度分成24个区,每个区有自己当下时间,比如中国就在东8区,代号+8。向东走一个区(日本,东九区),手表就要调快一个小时。
UTC
Coordinated Universal Time,简称UTC(世界标准时间或世界协调时间)
GMT并不精准,于是以GMT为准加上修正而成的时间,被称作为UTC,一般对于我们来说,这两个值没有差别。另外,早年的PC好像都是GMT,后来就换成了UTC时间。
CST
China Standard Time(中国标准时间),也就是我们每天所说的北京时间,我国是属东八区,转成UTC,加上+8的时区表示即可。
ISO8601
最后来看下关健性的一个,有了时间,但是在不同国家,不同人群,不同机器之间交流时,用什么样的格式呢。于是有了ISO8601这个标准。
其代表着日期和时间的表示方法,全名为《数据存储和交换形式·信息交换·日期和时间的表示方法》。
日期时间表示法: 年用4位数字,月、日,小时、分和秒都用2位数表示,中间用T分隔,表示这是一个UTC时间格式,在UTC标准时区(+0
)最后加一个大写字母Z,而其他时区用实际时间加时差表示。
比如下面的几个表示法:
2014-05-25T10:29:04+08:00
2014-05-25T10:29:01.000+08:00
这是上一个的精确表示法其中的.000是秒后面的小数点,找到这个解释不容易,感谢#SO
iOS 中Debug时显示的时间是用CTS表示的,Watch中可以看到
2014-05-25 10:29:04 CST
打印出来又是这样子的,被转成了UTC +0
时区标准时间
2014-05-25 02:29:04 +0000
然后在具体使用时,再加上当前的时区,转换成当地时间进行显示,iOS中可以这样转换:
Unix Timestamp
也被称作时间戳,它是GMT 1970年01月01日00时00分00秒
起至现在的总秒数。看起来是这样子的:1401200885364
时间戳0按照ISO 8601
格式写出来为 1970-01-01T00:00:00Z
。
另外,Timestamp是现在时间相对于标准0时之间的秒数,是没有时区的概念的。
这种格式在使用起来比较简单,如果不表示1970年之前的时间的话,但可读性却也是最差的,所以在API中很少有看到这种表示法。
系统时间及时区
那系统又是如何定义当地时间呢?以iOS为例:
在iPhone中有2样东西关系到国际化,当然也关系到时间表示。其中就是Local和TimeZone。在Local中可以设置系统的国家,语言、系统默认语言,日期的一些属性,如定义常用格式,如Short/Medium/Long/Full、也包括TimeZone,等等。TimeZone是指当前时区,可以手动设置,也可以让系统自己网络获取。
NSTimeZone
通过Default取系统时区,可以看到当前为Shanghai +8
NSLocale
NSLocale中配置着用户的本地化信息,如货币,语言,时间表示 http://nshipster.com/nslocale/
REF::
http://en.wikipedia.org/wiki/ISO_8601
http://my.oschina.net/yongbin45/blog/151376