Swift - 第三方日期处理库SwiftDate使用详解1(安装配置、基本用法)
作者:hangge | 2018-11-22 08:10
一、基本介绍
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 进来就可以了。
import SwiftDate
二、基本用法
1,日期解析(String 转 Date)
(1)通过默认格式解析
let date = "2018-12-12 10:30:00".toDate() print("日期:", date!.date)
(2)使用指定格式解析
let _ = "2018-12-12 10:30".toDate("yyyy-MM-dd HH:mm")
(3)从一些常见的日期时间格式(ISO8601,RSS,Alt RSS,.NET,SQL,HTTP ...)解析。
//解析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。
//从字符串创建 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 参数。
//指定一个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,日期提取
我们可以很方便地获取一个日期里的年、月、日等各部分数据。
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() 方法将日期时间输出成指定格式。
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分钟前、一小时前...),常用于消息、信息的时间显示。
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 输出成“时:分:秒”形式。
let interval: TimeInterval = (2.hours.timeInterval) + (34.minutes.timeInterval) + (5.seconds.timeInterval) print("倒计时:", interval.toClock())
5,闰年、闰月的判断
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 操作。
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)
全部评论(0)