DateTime学习

datetime

每个程序员都用过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中可以这样转换:

1
2
3
4
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale currentLocale];
formatter.timeZone = [NSTimeZone defaultTimeZone];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
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是指当前时区,可以手动设置,也可以让系统自己网络获取。

datetime

NSTimeZone

通过Default取系统时区,可以看到当前为Shanghai +8

1
2
[NSTimeZone defaultTimeZone]
Asia/Shanghai (GMT+8) offset 28800
NSLocale

NSLocale中配置着用户的本地化信息,如货币,语言,时间表示 http://nshipster.com/nslocale/

REF::

http://en.wikipedia.org/wiki/ISO_8601 
http://my.oschina.net/yongbin45/blog/151376

Cover Image Source

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值