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)
网友评论