浅谈iOS的时区

TC、GMT、UTC

TC(Universal Time)世界时, 是指格林尼治所在地的标准时间。个人认为可以把它等同为GMT。

GMT(Greenwich Mean Time)格林尼治标准时间, 是指位于伦敦郊区的皇家格林尼治天文台的标准时间。它是以地球自转为基础的时间计量系统。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差会有偏差。如今的标准时间——协调世界时(UTC)——由原子钟提供。为了方便,在不需要精确到秒的情况下,通常将GMT 和UTC 视作等同。但UTC 更加科学更加精确,它是以原子时为基础,在时刻上尽量接近世界时UT的一种时间计量系统。它的出现是现代社会对于精确计时的需要。

UTC是协调世界时,又称世界统一时间、时间标准时间、国际协调时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。UTC不属于任何时区,但是其他地区时间的表示可以跟时区挂钩,比如中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚的时间与UTC的时差均为+8,也就是UTC+8。

PS: 在精度要求没有那么高的情况下,我们可以认为它TC=GMT=UTC。

NSDate

NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).
The NSDate class provides methods for comparing dates, calculating the time interval between two dates, and creating a new date from a time interval relative to another date. NSDate objects can be used in conjunction with NSDateFormatter objects to create localized representations of dates and times, as well as with NSCalendar objects to perform calendar arithmetic.

从苹果的文档描述得知:

  1. NSDate是基于UTC的,与任何特定的日历系统或时区无关;所以当我们直接打印NSDate对象时“2020-07-20 03:41:23 +0000”与北京时间相差8个小时(虽然UTC跟时区无关,但UTC跟零时区的时间是几乎相等的)。

  2. NSDate可以和NSDateFormatter对象结合使用,用来创建本地化表示的时间字符串。系统认为将NSDate转换成字符串,默认应该是当前时区的,也这说得过去。如下:

    let nowDate = NSDate.now
                
    print(nowDate)
                
    let dateStr = DateFormatter.init(format: "yyyy-MM-dd HH:mm:ss").string(from: nowDate)
    print(dateStr)  

打印结果

    2020-07-20 03:57:39 +0000
    2020-07-20 11:57:39

当然你也可以给DateFormatter设置timeZone来指定时区

参考资料

百度百科
Apple developer文档

你可能感兴趣的:(浅谈iOS的时区)