第三方日期处理库SwiftDate使用详解

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,日期格式化输出
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: TimeZone.current)
    .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年后

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、日期操作、计算

1)对一个日期进行加减计算。

let date0 = Date()
print("当前日期:", date0)
 
let date1 = date0 + 1.years + 1.months + 1.days
print("计算后的日期1:", date1)
         
let date2 = date0 - 1.hours
print("计算后的日期2:", date2)

2)两个日期相减

let date1 = Date()
let date2 = date1 + 1.years + 1.months + 1.days
print("日期1:", date1)
print("日期2:", date2)
let tem = date2 - date1
print("两个日期相差:\(tem.year!)年\(tem.month!)月\(tem.day!)天")
7、日期比较

1)使用标准数学运算符(>、>=、<、<=、==)比较两个日期。

let date1 = "2018-12-12 10:30:00".toDate()!.date
let date2 = "2020-01-01 11:30:00".toDate()!.date
let date3 = "2020-01-01 11:30:00".toDate()!.date
         
print("日期1 >= 日期2:", date1 >= date2)
print("日期2 == 日期3:", date2 == date3)

2)也可以按指定的粒度比较两个日期。

let date1 = "2017-12-12 10:30:00".toDate()!.date
let date2 = "2018-12-01 11:30:00".toDate()!.date
let date3 = "2018-12-08 10:30:00".toDate()!.date
print("日期1:\(date1)")
print("日期2:\(date2)")
print("日期3:\(date3)")
 
let result1 = date1.compare(toDate: date2, granularity: .month) == .orderedSame
print("日期1与日期2年月是否相同:\(result1)")
         
let result2 = date1.isBeforeDate(date2, orEqual: false, granularity: .year)
print("日期1的年份是否在日期2年份前面:\(result2)")
         
let result3 = date3.isAfterDate(date2, orEqual: true, granularity: .month)
print("日期3是否在日期3之后的年月、或者统一年月:\(result3)")

3)判断一个日期是否在一个日期范围中

let date1 = "2017-12-12 10:30:00".toDate()!.date
let date2 = "2018-12-01 11:30:00".toDate()!.date
let date3 = "2018-12-08 10:30:00".toDate()!.date
 
//不指定粒度
date2.isInRange(date: date1, and: date3) //true
 
//指定粒度
date2.isInRange(date: date1, and: date3, orEqual: true, granularity: .day) //true

4)判断一个日期是否接近另一个日期(可指定精度)

let date1 = "2018-12-12 10:30:00".toDate()!.date
let date2 = "2018-12-13 09:30:00".toDate()!.date
 
var result = date1.compareCloseTo(date2, precision: 1.days.timeInterval)
print("两个日期相差小于一天:\(result)")  //true

5)与内置的常用日期进行比较

let date = "2018-11-22 22:30:00".toDate()!.date
print("测试日期时间:", date)
print("")
print("该日期时间是否是早上:", date.compare(.isMorning))
print("该日期时间是否是下午:", date.compare(.isAfternoon))
print("该日期时间是否是傍晚:", date.compare(.isEvening))
print("该日期时间是否是夜里:", date.compare(.isNight))
print("")
print("该日期时间是否是今天:", date.compare(.isToday))
print("该日期时间是否是明天:", date.compare(.isTomorrow))
print("该日期时间是否是昨天:", date.compare(.isYesterday))
print("该日期时间是否是工作日:", date.compare(.isWeekday))
print("该日期时间是否是周末:", date.compare(.isWeekend))
print("该日期时间是否是过去的:", date.compare(.isInThePast))
print("该日期时间是否是将来的:", date.compare(.isInTheFuture))
print("")
print("该日期时间是否是本周:", date.compare(.isThisWeek))
print("该日期时间是否是下周:", date.compare(.isNextWeek))
print("该日期时间是否是上周:", date.compare(.isLastWeek))
print("")
print("该日期时间是否是今年:", date.compare(.isThisYear))
print("该日期时间是否是明年:", date.compare(.isNextYear))
print("该日期时间是否是去年:", date.compare(.isLastYear))
8、日期集合的排序、获取首尾日期

1)将一个日期数组升序、降序排列。

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))

2)获取一个日期数组中最早、最新的一个日期。

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