SwiftDate日期库使用详解
一、基本介绍
1、什么是SwiftDate?
(1) SwiftDate是一个使用Swift语言编写的Date的封装库,使用它可以很方便的对日期进行处理,方便我们工程对日期显示的格式需求。
(2) SwiftDate功能强大,本身swift相对Objective-C,语法上就要简单很多,操作起来更简单易懂,无论是简单的日期操作,还是复杂的业务逻辑都能满足。如如:
- 支持数学运算进行日期计算(通过两个日期的+,-操作)
- 支持比较运算符(通过两个日期的>,<,>=,<=,==)
- 快速获取日期的部分内容(比如获取一个日期中的年份,月份,日)
- 提供一系列.toString()方法
- 提供简便的方法获取(比如:今天,昨天,明天等)
2、安装使用
(1)使用cocoaPods安装(备注: GitHub 上下载最新的代码:https://github.com/malcommac/SwiftDate
)
pod 'SwiftDate', '~> 6.0.3'
(2)在需要使用SwiftDate的地方,import进来就可以了
import SwiftDate
二、主要概念、主要类
DateInRegion 和 Region
SwiftDate为了提供完整的时间和日期管理的功能,引入了两个重要的新玩意以及相应扩展。
第一个是一个结构体(struct),称为Region:region,它是对一个地理位置在时间体系中的描述,其中包含三个不同的特征:
- TimeZone:用来定义时区。时区在一定程度上表示了不同地区,因此,地区的名字的可作为时区的名称,例如夏威夷时区,北京时间。类似的,格林尼治时间(GMT)或美国西部时间(PST)的偏移量, 也可以用来表示时区,例如东八区(GMT +8)
- Calendar: 用来表示日历体系,日历体系定义了年与月的长度与划分。SwiftDate 提供了不同日历的信息,还支持不同日历下时间的计算,例如给出绝对时间值,SwiftDate 可以确定他在指定日历系统下的日期。
- local: 用来表示当地的时间表述方式。由于各地的文化、语言、规范的不同,时间在各地用不同的分隔符或语法来表示。比如 中国地区一般采用 年-月-日 时:分:表,而美国地区多采用 月-日-年 时:分:秒
另一个是DateInRegion,是在特定的国家地区 Region 下,描述一个自身与具体时区和日历无关的时间Date。这是由于特定的国家地区一般采用固定的时区、日历系统与表述规范,只要声明了国家地区,就包含了以上三个要素。实际应用中,使用DateInRegion可以方便的操作上下文中的日期。
SwiftDate 为您提供相同的函数和属性,以管理带有地区属性的DateInRegion时间实例 和 单纯Date时间实例。
三、基本用法
-
时间字符串 转 Date(支持任何格式)
let date = "2019-06-27 14:30:30".toDate() print("date:\(date!.date)") let date1 = "2019-06-27 14:30".toDate("yyyy-MM-dd HH:mm") print("date1:\(date1!.date)")
执行结果
-
创建Date的方式
let date2 = DateInRegion("2019-06-27 14:30:30")! print("date2:\(date2.date)") let date3 = DateInRegion(seconds: 342000); print("date3:\(date3.date)") let region = Region() let date4 = DateInRegion(components: { $0.year = 2019 $0.month = 6 $0.day = 27 $0.hour = 14 $0.minute = 30 }, region: region) print("date4:\(date4!.date)") let date5 = DateInRegion(year: 2019, month: 6, day: 27, hour: 14, minute: 30, second: 30, nanosecond: 0, region: region) print("date5:\(date5.date)")
执行结果
-
对日期的操作:取一个日期的年、月、日、时、分秒等
let date6 = Date() print("date6:\(date6)") print("date6:\(date6.year)") print("date6:\(date6.month)") print("date6:\(date6.day)") print("date6:\(date6.hour)") print("date6:\(date6.minute)") print("date6:\(date6.second)") print("date6 本月名称:\(date6.monthName(.default))") print("date6 本日名称:\(date6.weekdayName(.default))") print("date6 本周第一天:\(date6.firstDayOfWeek)") print("date6 本周最后一天:\(date6.lastDayOfWeek)")
执行结果
-
对日期的加减操作(获取几天前的日期或者几天后的日期)
let date7 = Date() print("date7:\(date7)") let date8 = date7 + 1.years + 1.months + 1.days let date9 = date7 - 1.years - 2.months - 3.days - 4.hours print("date8:\(date8)") print("date9:\(date9)") let date10 = date8 - date9; print("date10:\(date10.year!)年\(date10.month!)月\(date10.day!)日")
执行结果
-
日期比较 (>,<,>=,<=,==,!=)
print("\(date9 > date8)") print("\(date9 > date7)") print("\(date8 >= date7)")
执行结果
-
日期的粒度比较(是否童年,同月、同天等)
let date11 = "2017-12-12 10:30:00".toDate()!.date let date12 = "2018-12-01 11:30:00".toDate()!.date let date13 = "2018-12-08 10:30:00".toDate()!.date print("日期11:\(date11)") print("日期12:\(date12)") print("日期13:\(date13)") let result = date11.compare(toDate: date12, granularity: .month) == .orderedSame let result2 = date12.compare(toDate: date13, granularity: .month) == .orderedSame print("result:\(result)") print("result2:\(result2)") let result3 = date11.isBeforeDate(date12, orEqual: false, granularity: .year) let result4 = date11.isBeforeDate(date12, granularity: .month) print("result3:\(result3)") print("result4:\(result4)") let result5 = date12.isAfterDate(date13, granularity: .month) let result6 = date13.isAfterDate(date11, granularity: .year) print("result5:\(result5)") print("result6:\(result6)") //不指定粒度 let result7 = date12.isInRange(date: date11, and: date13) //true let result8 = date12.isInRange(date: date11, and: date13, orEqual: true, granularity: .day) //true print("result7:\(result7)") print("result8:\(result8)")
执行结果
7.常用日期比较
let date14 = Date("2018-06-24 14:40")!.date
print("")
print("测试日期时间:", date14)
print("")
print("该日期时间是否是早上:", date14.compare(.isMorning))
print("该日期时间是否是下午:", date14.compare(.isAfternoon))
print("该日期时间是否是傍晚:", date14.compare(.isEvening))
print("该日期时间是否是夜里:", date14.compare(.isNight))
print("")
print("该日期时间是否是今天:", date14.compare(.isToday))
print("该日期时间是否是明天:", date14.compare(.isTomorrow))
print("该日期时间是否是昨天:", date14.compare(.isYesterday))
print("该日期时间是否是工作日:", date14.compare(.isWeekday))
print("该日期时间是否是周末:", date14.compare(.isWeekend))
print("该日期时间是否是过去的:", date14.compare(.isInThePast))
print("该日期时间是否是将来的:", date14.compare(.isInTheFuture))
print("")
print("该日期时间是否是本周:", date14.compare(.isThisWeek))
print("该日期时间是否是下周:", date14.compare(.isNextWeek))
print("该日期时间是否是上周:", date14.compare(.isLastWeek))
print("")
print("该日期时间是否是今年:", date14.compare(.isThisYear))
print("该日期时间是否是明年:", date14.compare(.isNextYear))
print("该日期时间是否是去年:", date14.compare(.isLastYear))
执行结果
8.日期排序
let dates = ["2018-11-22 22:30:00".toDate()!,
"2017-11-01 01:30:00".toDate()!,
"2019-11-01 10:30:00".toDate()!]
print("排序前:\(dates)")
print("降序排序:\(DateInRegion.sortedByNewest(list: dates))")
print("升序排序:\(DateInRegion.sortedByOldest(list: dates))")
print("\(DateInRegion.oldestIn(list: dates)!.date)")
print("\(DateInRegion.newestIn(list: dates)!.date)")
执行结果
四、使用场景
营养秤新项目,我们改用使用swift开发,我们希望在项目中能够轻松自如的管理日期和时区,所以就使用到了SwiftDate这个库,有了“它”在swift里面就可以优雅的处理时间