细品Swift:关于时间的一切(2)

Swift基础库时间小分队

时间问题是任何一个语言都绕不开的领域。

Swift基础库提供了多个类型,他们共同作用解决时间问题。与某些语言只有一两个核心时间类型相比,Swift时间管理相对复杂, 所以我们要理清楚他们之间的相互关系,才能发挥其强大作用。

Swift的时间类型矩阵包括时间表示、历法计算、文本显示(格式化)等,他们的关系是逐级支撑的,如时间表示是基础能力,在此能力之上再通过特定历法把时间转化为人们能够使用的组件,格式化文本进一步转化为可读写的字符串。

Pasted Graphic 10.png

时间表示

  1. Date:表示某个时间点,即一维时间轴上的某个绝对点。是纯粹表达时间的类型,和任何具体的日历、时区或者本地化无关。 需要通过特定Calendar(日历系统)转化为人们能够理解的概念,如2022年1月2日14时2分11秒。
  2. DateInteval: 用起始时间和结束时间表示的一个时间跨度: [起始时间Date,结束时间Date]是一个封闭的周期。 结束时间可以等于或者晚于起始时间,但不能早于起始时间。这个类型是对Date表示一个时间点的补充,它表现出了一个时间跨度。
  3. TimeInterval: 用秒表示的时间间隔,Double类型。

注意,swift中的Date表达的是我们日常中所说的时间概念。 Swift基础库中并没有Time这一类型。

Date表示一个独立于任何历法系统的时间点, DateInterval表示一个被起始时间和结束时间规定的时间跨度,TimeInterval是以秒为单位的一个数值,表示时间跨度的大小。这三个概念合起来,在没有任何历法系统的基础上可以表示任何时间的点(点)、始终跨度(线段)和长度(长度)。

历法计算

  1. Calendar:日历系统,把时间点转化为人们容易理解、方便记忆和交流的表达系统,以及反向的转化。
  2. DateComponents: 时间组件,把时间的组件氛围年月日时分秒,并用Calendar系统转化为具体的时间。
  3. TimeZone: 定义了在不同时区之间进行时间转化的行为规则。 主要包括指定时区于格林威治标准时间的偏移量,以及时区特定的英文缩写和识别符。

Swift使用Calendar、DateComponents和TimeZone三种类型,把物理上的时间概念和人们日常使用的历法系统及时区对应起来。这三个类型可以比作密码破译机器,将不可读的Date等类型,翻译成人们能够理解的日期和时间概念。

人们理解和使用时间,必须通过使用历法系统。swift使用Calendar类型来处理历法。Calendar通过不同的识别符创建,我们最常用的如gregorian代表公历,chinese代表中国农历等。 也可以通过current/autoupdatingCurrent方法来获取当前系统使用的历法。

Calendar的拆解组件功能可以从时间或者时间周期拆解出相应的历法组件(年月日时分秒等)。相关的成员函数有component (拆解出单个组件)和dateComponents(针对时间点或者时间跨度拆解出多个组件),也可以比较一个Date和一个DateComponents是否符合。

反过来,Calendar的组装时间功能可以从提供的时间组件中计算出对应的时间点,这是由一系列的date成员函数提供的。 其中包括设置某些组件或在组件基础上增加数值的不同途径获取新时刻。

Calendar提供了计算时间跨度的功能。如提供某一个时间点针对特定时间组件的时间跨度(通过DateInterval或inout参数返回),以及特定周末的时间跨度等。 这些函数很多包含dateInterval字串。

Calendar的扫描时间功能提供了重复枚举时间组件(及组合)的功能,如重复每天或每小时,在符合重复条件时可调用closure的功能。 Calendar提供了计算某个时间所在天的最早时刻功能。

Calendar提供了时间比较功能。 时间比较时基于提供的粒度属性,提供了知道此粒度的比较结果。例如,粒度组件参数设置为小时,则比较从最大的时间组件向下比较到小时结束,不往下进行。 此功能模块还提供了两个时间点是否在一天、某个时间点是否在今天、昨天、明天或者周末的能力。

Calendar还提供了其他琐碎功能,如比较两个日历系统是否一致、获取上下午、星期、月、季、公元等符号。

可以通过属性直接获取的Calendar信息包括标识字符串、时区、区域设置、周起始日、第一周最少天数、时间组件的最大和最小范围、某个时间点较小时间组件在较大时间组件的序数和范围等。

DateComponents的初始化比较难理解的一点是如果某一组件或者calendar、timeZone没有给初始值(默认为nil),那它对应的时间是怎么计算的。 又或者如果某两个组件数值相互冲突,如日期和周几的数值不一致,是如何处理的。 结论是calendar参数是必须要提供的,否则其他函数都不能返回有效值。在有calendar参数的情况下,其他参数缺失也能提供默认值为0或者1, 从而可以返回有效的date;即使参数冲突、或者参过限度,时间是否合法的判断函数返回false,其他获取组件的函数仍然能够工作,甚至能否返回对应的date。

DateComponents同时提供了访问和设置各个子属性值的方法。

TimeZone可以通过current和autoupdatingCurrent两个方法获取当前系统的时区,后一种会跟随系统设置的变化自动调整。
TimeZone的初始化可以通过识别符、缩写,或者与GMT的秒差创建。 TimeZone提供了类型函数来列举所有已知的识别符和缩写字典。
TimeZone提供了对识别符、缩写、和GMT的秒差等信息,及对夏令时的一些操作。


Pasted Graphic.png

格式化文本

  1. DateFormatter:时间的格式化,提供了时刻Date和它的文本表示之间的对应和转换。
  2. DateComponentsFormatter: 时间组件的格式化。
  3. DateIntervalFormatter:时间间隔的格式化。
  4. ISO8601DateFormatter: 基于8601国际标准的时间格式化。

DateFormatter提供了字符串和时间时间的互相转换。

可以通过两种方法设置时间表达字符串的格式,一个是通过dateStyle和timeStyle属性;另外一种方法是通过fixed的方法,dateFormat输入格式字串。
DateFormater可以操作的属性包括: 历法系统、 区域设置、时区、两位数字的起始时间、公历起始时间等等,以及获取上下午、星期、月和季度的表示符号等。

Pasted Graphic 1.png
Pasted Graphic 3.png

时间组件的文本表示通过DateComponentsFormatter完成。 此类的方法不仅有把时间转化为字符串的方法,还另外包括将时间跨度格式为字符串。


Pasted Graphic 4.png

DateIntervalFormatter是对时间跨度进行格式化的类型。

Pasted Graphic 5.png

ISO8601Formatter是基于国际标准的日期和时间与文本相互转化工具。

Pasted Graphic 7.png

Locale区域设置中,有关于时间的部分,包括时间的文本显示、时区、历法、周首日等。

Pasted Graphic 8.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容