返回 导航

Swift

hangge.com

Swift - 第三方日期处理库SwiftDate使用详解1(安装配置、基本用法)

作者:hangge | 2018-11-22 08:10

一、基本介绍

1,什么是 SwiftDate?

(1)SwiftDate 是一个使用 Swift 语言编写的 Date 封装库,使用它可以很方便地对日期进行处理。
(2)SwiftDate 功能强大,无论是简单的日期操作,还是复杂的业务逻辑都能满足。比如:
  • 支持数学运算符进行日期计算(比如 myDate + 2.week + 1.hour)
  • 支持比较运算符(比如 <>==<=>=
  • 快速获取/修改日期各部分内容(比如获取或修改日期中的月份)
  • 提供通用格式化输出或自定义的格式化输出
  • 提供一系列 .toString() 方法
  • 提供简便的方法获取 yesterdaytomorrow

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)从一些常见的日期时间格式(ISO8601RSSAlt RSS.NETSQLHTTP ...)解析。
//解析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)我们也可以使用指定地区 RegionTimezone, 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)

回到顶部