有一个多月没有更新简书了,因为工作确实比较忙,天天加班。现在APP已经上线,是时侯继续我的写作之旅了。这次项目里面会进行大量的日期时间操作。比如获取某日期年月日,时分。两个日期的比较。设置某个日期的时间等操作。总之这次开发过程中不友好
NSDate
和其相关类的API让我感到不爽,感觉iOS原生的日期类非常不好用。于是我便萌生了自己写一个关于操作NSDate
的类的想法,因以我以前是用C#,感觉C#的日期时间类比较优雅,我便参考它写了个iOS的DateTime
,今天我便分享给大家。
iOS对日期和时间的操作的不足
NSDate
是iOS表示日期时间的核心类。但是它也只能表示时间,如果需要格式化输出,需要使用到NSDateFormatter
类,而如果需要取出里面的年月日和时分秒,则需要用到NSDateComponents
和NSCalendar
。相信每一位iOS开发者都会掌握这些类的使用,这里就不写示例代码了。虽然职责分离是一种好的设计,但是需要你大量对日期时间的比较,格式化输出等操作时,使用这些类来非常繁琐,要写很多的重复的代码,影响了开发效率。GrandTime
正是解决这个问题而生的。
GrandTime组成
GrandTime
由三个类组成:DateTime
,TimeSpan
和GrandTimer
。DateTime
是最核心的类,封装了NSDate
和NSDateComponents
。把年月日时分秒的操作变得十分简单方便。而TimeSpan
是一段时间间隔,相当于NSTimeInterval
,同时还封装了很多功能。而GrandTimer是一个会自动停止的弱Timer
,并且提供了Block
来方便调用。下面我一个一个来介绍怎么使用。
DateTime
DateTime
类封装了常见的日期时间操作。它提供了如下8个构造函数
相信这8个构造函数可以满足绝大部分的使用场景。里面有两个需要说明一下,tick
在里面是指毫秒,而timestamp
是Unix
时间戳。默认的无参构造函数和NSDate
一样,都是使用当前时间。
下面看看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//正面看看构造函数 let a = DateTime() //直接初始化 print(a) let c = DateTime(date: NSDate(timeInterval: 3600, sinceDate: NSDate())) //使用NSDate初始化 print(c) let e = DateTime(tick: 1000000) //使用Tick初始化 从1970年开始 print(e) let f = DateTime(tickSinceNow: 60000) //使用Tick初始化 从现在年开始 print(f) let g = DateTime(timestamp: 100000)//使用Stamp初始化 print(g) let h = DateTime(year: 2008, month: 2, day: 29) //使用年月日初始化 print(h) let i = DateTime(year: 2016, month: 12, day: 12, hour: 11, minute: 44, second: 12, millisecond: 111)!//使用年月日时分秒毫秒初始化 print(i) 打印结果: 2016-07-18 15:04:37:779 2016-07-18 16:04:37:779 Optional(1970-01-01 08:16:40:000)//注意里面存在初始化失败这种情况,我没有直接抛出异常,而是返回可选值。 Optional(2016-07-18 15:05:37:780) Optional(1970-01-02 11:46:40:000) Optional(2008-02-29 00:00:00:000) 2016-12-12 11:44:12:000 |
我为DateTime
提供了操作符重载
1 2 3 4 5 6 7 8 9 10 11 12 13 |
let timeSpanOneMinute = TimeSpan.fromMinuts(1) //声明一个一分钟的TimeSpan let dToOneMinuteBefore = a - timeSpanOneMinute // 一分钟前 print("一分钟前\(dToOneMinuteBefore)") let dToOneMinuteAfter = a + timeSpanOneMinute // 一分钟后 print("一分钟后\(dToOneMinuteAfter)") //两个DateTime相减生成一个TimeSpan let span = c - a print("a和c相差一小时\(span)") print("a>c:\(a>c)") print("ac:false a |
DateTime
也提供了一系列Add
方法,可以对自身操作。改变自己的时间值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
a.addYears(1) //加一年 print("add Years:\(a)") a.addMonth(1) // 加 一个月 print("add addMonth:\(a)") a.addDays(1pan>"add addMonth:\(a)") a.addDays(1Ξ比较忙,天天加班。现在APP已经上线,是时侯继续我的写作之旅了。这次项目里面会进行大量的日期时间操作。比如获取某日期年月日,时分。两个日期的比较。设置某个日期的时间等操作。总之这次开发过程中不友好 NSDate 和其相关类的API让我感到不爽,感觉iOS原生的日期类非常不好用。于是我便萌生了自己写一个关于操作NSDate 的类的想法,因以我以前是用C#,感觉C#的日期时间类比较优雅,我便参考它写了个iOS的DateTime ,今天我便分享给大家。
iOS对日期和时间的操作的不足
GrandTime组成
DateTime
相信这8个构造函数可以满足绝大部分的使用场景。里面有两个需要说明一下,
我为
|