Swift - 第三方日期处理库SwiftDate使用详解1(安装配置、基本用法)
一、基本介绍
1,什么是 SwiftDate?
(1)SwiftDate 是一个使用 Swift 语言编写的 Date 封装库,使用它可以很方便地对日期进行处理。
(2)SwiftDate 功能强大,无论是简单的日期操作,还是复杂的业务逻辑都能满足。比如:
- 支持数学运算符进行日期计算(比如 myDate + 2.week + 1.hour)
- 支持比较运算符(比如 <、>、==、<=、>=)
- 快速获取/修改日期各部分内容(比如获取或修改日期中的月份)
- 提供通用格式化输出或自定义的格式化输出
- 提供一系列 .toString() 方法
- 提供简便的方法获取 yesterday、tomorrow 等
2,安装配置
(1)从 GitHub 上下载最新的代码:https://github.com/malcommac/SwiftDate
(2)将下载下来的源码包中 SwiftDate.xcodeproj 拖拽至你的工程中:

(3)工程 -> General -> Embedded Binaries 项,把 iOS 版的 framework 添加进来:SwiftDate.framework

(4)最后,在需要使用 SwiftDate 的地方 import 进来就可以了。
1 | import SwiftDate |
二、基本用法
1,日期解析(String 转 Date)
(1)通过默认格式解析

1 2 | let date = "2018-12-12 10:30:00" .toDate() print ( "日期:" , date!.date) |
(2)使用指定格式解析
1 | let _ = "2018-12-12 10:30" .toDate( "yyyy-MM-dd HH:mm" ) |
(3)从一些常见的日期时间格式(ISO8601,RSS,Alt RSS,.NET,SQL,HTTP ...)解析。
1 2 3 4 5 | //解析ISO8601日期 let date1 = "2018-12-17T11:59:29+02:00" .toISODate() //解析RSS日期 let date2 = "19 Nov 2018 22:20:40 +0100" .toRSSDate(alt: true ) |
2,使用 DateInRegion 创建 Date
(1)我们可以从字符串,时间间隔或使用日期组件创建新日期。下面使用默认的地区 Region。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //从字符串创建 let date1 = DateInRegion ( "2018-08-08 08:00:00" )! print ( "data1:" , date1.date) //从时间间隔创建 let date2 = DateInRegion (seconds: 39940) let date3 = DateInRegion (milliseconds: 5000) print ( "data2:" , date2.date) print ( "data3:" , date3.date) //通过指定日期各部分创建(方式1) let data4 = DateInRegion (components: { $0.year = 2014 $0.month = 9 $0.day = 11 $0.hour = 12 $0.minute = 0 }, region: region) print ( "data4:" , data4!.date) //通过指定日期各部分创建(方式2) let date5 = DateInRegion (year: 2015, month: 1, day: 5, hour: 23, minute: 30, second: 0) print ( "data5:" , date5.date) |
(2)我们也可以使用指定地区 Region(Timezone, Calendar & Locale)创建 Date,与上面相比就是多了个 region 参数。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //指定一个Region let rome = Region (calendar: Calendars .gregorian, zone: Zones .europeRome, locale: Locales .italian) //从字符串创建 let date1 = DateInRegion ( "2018-08-08 08:00:00" , region: rome)! print ( "data1:" , date1.date) //从时间间隔创建 let date2 = DateInRegion (seconds: 39940, region: rome) let date3 = DateInRegion (milliseconds: 5000, region: rome) print ( "data2:" , date2.date) print ( "data3:" , date3.date) //通过指定日期各部分创建(方式1) let data4 = DateInRegion (components: { $0.year = 2014 $0.month = 9 $0.day = 11 $0.hour = 12 $0.minute = 0 }, region: rome) print ( "data4:" , data4!.date) //通过指定日期各部分创建(方式2) let date5 = DateInRegion (year: 2015, month: 1, day: 5, hour: 23, minute: 30, second: 0, region: rome) print ( "data5:" , date5.date) |
3,日期提取
我们可以很方便地获取一个日期里的年、月、日等各部分数据。

1 2 3 4 5 6 7 8 9 10 11 12 | let date = Date () print ( "当前日期:" , date) print ( "年:" , date.year) print ( "月:" , date.month) print ( "日:" , date.day) print ( "时:" , date.hour) print ( "分:" , date.minute) print ( "秒:" , date.second) print ( "本月名称:" , date.monthName(. default )) print ( "本日名称:" , date.weekdayName(. default )) print ( "本周第一天:" , date.firstDayOfWeek) print ( "本周最后一天:" , date.lastDayOfWeek) |
4,日期格式化输出
(1)使用 toFormat() 方法将日期时间输出成指定格式。

1 2 3 4 5 6 | let date = "2018-12-12 10:30:00" .toDate()! //不转换时区 print ( "时间1:" , date.toFormat( "yyyy-MM-dd HH:mm:ss" )) //转换时区(东8区) print ( "时间2:" , date.convertTo(timezone: Zones .asiaShanghai) .toFormat( "yyyy-MM-dd HH:mm:ss" )) |
(2)输出一个时间相对于当前时间的格式(5分钟前、一小时前...),常用于消息、信息的时间显示。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | let r1 = ( Date () - 2.years).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //2年前 let r2 = ( Date () - 10.months).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //10个月前 let r3 = ( Date () - 3.weeks).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //3周前 let r4 = ( Date () - 5.days).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //5天前 let r5 = ( Date () - 12.hours).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //12小时前 let r6 = ( Date () - 30.minutes).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //30分钟前 let r7 = ( Date () - 30.seconds).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //现在 let r8 = ( Date () + 30.seconds).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //现在 let r9 = ( Date () + 30.minutes).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //30分钟后 let r10 = ( Date () + 12.hours).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //12小时后 let r11 = ( Date () + 5.days).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //5天后 let r12 = ( Date () + 3.weeks).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //3周后 let r13 = ( Date () + 10.months).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //10个月后 let r14 = ( Date () + 2.years).toRelative(style: RelativeFormatter .defaultStyle(), locale: Locales .chinese) //2年后 print (r1) print (r2) print (r3) print (r4) print (r5) print (r6) print (r7) print (r8) print (r9) print (r10) print (r11) print (r12) print (r13) print (r14) |
(3)使用 .toClock() 方法将 TimeInterval 输出成“时:分:秒”形式。

1 2 3 | let interval: TimeInterval = (2.hours.timeInterval) + (34.minutes.timeInterval) + (5.seconds.timeInterval) print ( "倒计时:" , interval.toClock()) |
5,闰年、闰月的判断

1 2 3 4 | let date = "2000-03-12 10:30:00" .toDate()!.date print( "测试时间:" , date) print( "是否是润年:" , date.isLeapYear) print( "是否是闰月:" , date.isLeapMonth) |
6,Codable 序列化
无论是 DateInRegion 还是 Region 都是完全支持 Swift 的 Codable 协议,这就意味着我们可以方便安全地对它们进行 encode 和 decode 操作。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | print ( "--- Region序列化和反序列化 ---" ) let region = Region (calendar: Calendars .gregorian, zone: Zones .europeOslo, locale: Locales .english) let encodedJSON = try! JSONEncoder ().encode(region) print ( "encoded" , encodedJSON) let decodedRegion = try! JSONDecoder ().decode( Region . self , from: encodedJSON) print ( "decoded" , decodedRegion) print ( "\n" ) print ( "--- DateInRegion序列化和反序列化 ---" ) let date = DateInRegion ( "2015-09-24T13:20:55" , region: region) let encodedDate = try! JSONEncoder ().encode(date) print ( "encoded" , encodedDate) let decodedDate = try! JSONDecoder ().decode( DateInRegion . self , from: encodedDate) print ( "decoded" , decodedDate) |