个人项目
写在前面
欢迎大家关注我的个人博客:博客地址,这里主要是我在个人开发时候遇到的坑和挖完的坑,包括 PHP CentOS 以及 Swift 等相关只是
最近一直在搞岗位竞聘,虽然没有成功,但也算一次不错的经历,有些东西还是要看开些比较好;好啦,一个多周没有碰Swift手有点生,找了一个关于日期教程学习整理了一下(灵感来自:swift.gg)
其实这篇博文准备写很久了,奈何工作确实有点忙,搞得自己有点晕头转向,后面还有一个关于NSDate的拓展库,我会在后面的博客中写出来教大家如何深入学习NSDate的实战开发。
下面就开始写吧。
目标:
- 认识NSDate
- 学习NSDateFormatter
- 学习NSCalendar和NSDateComponents
- 学习日期比较和计算
学习NSDate
1.一个简单的NSDate
```
//获取当前时间
let currentDate = NSDate()####2.NSDateFormatter的介绍 NSDate <--> String转换(dateFromString和stringFromDate),并且可以设置NSDate输出的多种属性:日期区域、日期格式(完整或省略格式)和日期形式(2015年-12月19日 或 2015-12-19 01:11等展示形式) - 设置区域(locale)
``` let dateFormatter = NSDateFormatter() //设置locale两种方式: dateFormatter.locale = NSLocale.currentLocale() dateFormatter.locale = NSLocale(localeIdentifier: "el_GR")//希腊 ```- 设置日期格式(NSDateFormatterStyle)``` //设置格式为FullStyle,然后转换成String类型 dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle var convertedDate = dateFormatter.stringFromDate(currentDate) /* NSDateFormatterStyle枚举类型: FullStyle格式:"Saturday, December 19, 2015" LongStyle格式:"December 19, 2015" MediumStyle格式:"Dec 19, 2015" ShortStyle格式:"12/19/15" */ ```- 设置日期形式(dateFormat) >各种字符的描述(重要) EEEE: 表示星期(如:Saturday)。使用1-3个字母(E)表示星期的缩写(Sat) MMMM: 月份全写(如:December)。使用3个字母(M)表示月份的缩写(Dec),使用1-2个字母(M)表示数字月份 dd: 表示一个月里面日期的数字(09 和 15) yyyy: 4个数字表示年(如2015) HH: 2个数字表示小时(如:08 或 19) mm: 2个数字表示分钟(如:05 或 54) ss: 2个数字表示秒 zzz: 3个字母表示时区``` dateFormatter.dateFormat = "yyyy-MM-dd MMMM EEEE" let convertedDate = dateFormatter.stringFromDate(currentDate) //展示结果:"2015-12-19 December Saturday" dateFormatter.dateFormat = "yyyy-MM-dd MMM EEE" convertedDate = dateFormatter.stringFromDate(currentDate) //展示结果:"2015-12-19 Dec Sat" dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" convertedDate = dateFormatter.stringFromDate(currentDate) //展示结果:"2015-12-19 01:31:54" ```- dateFromString的使用 >上面的操作都是设置NSDate的格式使用stringFromDate方法,获得对应字符串(String)下面通过dateFromString活的NSDate``` //注意设置的日期格式要跟字符串的日期格式保持一致 var dateAsString = "2015-12-15 09:14" dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" var newDate = dateFormatter.dateFromString(dateAsString) //展示结果:"Dec 15, 2015, 9:14 AM" ```####3.NSDateComponents介绍 - 介绍各种日期组件``` /* Year: 年 Month: 月 Weekday:星期 Day:日 Hour: 时 Minute: 分 Second: 秒 Nanoscond:微秒 WeekOfYear:一年中的第几个星期 WeekOfMonth:一个月中的第几个星期 WeekdayOrdinal:未知 */ ```- NSCalendar介绍 >NSCalendar:实现NSDate到NSDateComponents对象的转换 - 实现NSDate -->NSDateComponents``` let calendar = NSCalendar.currentCalendar() let dateComponents = calendar.components([NSCalendarUnit.Day,NSCalendarUnit.Month,NSCalendarUnit.Year,NSCalendarUnit.WeekOfYear,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second,NSCalendarUnit.Nanosecond,NSCalendarUnit.Weekday], fromDate: currentDate) //这样可以查看当前日期Day/Month/Year/WeekOfYear/Hour/Minute/Second/NanoSecond/Weekday信息 print("年=\(dateComponents.year),月=\(dateComponents.month),日=\(dateComponents.day),小时=\(dateComponents.hour),分钟=\(dateComponents.minute),秒=\(dateComponents.second),微秒=\(dateComponents.nanosecond),一年中第\(dateComponents.weekOfYear)个星期,今天是星期\(dateComponents.weekday-1)") //打印结果:"年=2015,月=12,日=19,小时=1,分钟=50,秒=48,微秒=663465976,一年中第51个星期,今天是星期6\n" ```- 实现NSDateComponents --> NSDate``` let components = NSDateComponents() components.year = 2015 components.month = 12 components.day = 15 components.hour = 09 components.minute = 58 let newDate = calendar.dateFromComponents(components) //结果展示:"Dec 15, 2015, 11:58 PM" ```####4.日期比较 我主要推荐两种官方方式:(earlierDate与laterDate)和compare - 两种方式创建日期``` //结合前面学到的使用NSDateFormatter和NSCalendar创建两个时间 //方式一:NSCalendar let newCalendar = NSCalendar.currentCalendar() let newComponents = NSDateComponents() newComponents.year = 2015 newComponents.month = 12 newComponents.day = 20 newComponents.hour = 11 newComponents.minute = 55 newComponents.second = 11 let newDate1 = newCalendar.dateFromComponents(newComponents)! //方式二:NSDateFormatter let newDateFormatter = NSDateFormatter() newDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let newDateString = "2015-12-20 11:55:11" let newDate2 = newDateFormatter.dateFromString(newDateString)! ```- earlierDate与laterDate实现比较 >原理: earlierDate: 1.如果date1对象比date2早,那么返回date1,反之返回date2 2.如果两者相等,则返回date1 laterDate:反之``` if newDate1 == newDate1.earlierDate(newDate2){ print("newDate1不晚于newDate2") } else { print("newDate1晚于newDate2") } if newDate1 == newDate1.laterDate(newDate2) { print("newDate1不早于newDate2") } else { print("newDate1早于newDate2") } ```>很明显上面两个事件相等,则返回值是"newDate1不晚于newDate2"和"newDate1不早于newDate2" 如果讲上面的newComponents.second = 10,这样明显就是newDate1早了,在看下结果:"newDate1不晚于newDate2\n"和"newDate1比newDate2早\n" - compare方法 >原理:newDate1.compare(newDate2)得到的结果是一个NSComparisonResult枚举类型中的元素 NSComparisonResult: OrderedDescending:降序,说明前一个时间大 OrderedAscending:升序,说明前一个时间小 OrderedSame:相等,时间相同``` if newDate1.compare(newDate2) == NSComparisonResult.OrderedDescending { print("newDate1比newDate2晚") }else if newDate1.compare(newDate2) == NSComparisonResult.OrderedAscending { print("newDate1比newDate2早") }else if newDate1.compare(newDate2) == NSComparisonResult.OrderedSame { print("newDate1与newDate2同时") } ```####4.时间计算 >先简单看一个添加月份的例子``` let currentDate = NSDate() //当前时间 let monthsToAdd = 2 var calculatedDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Month, value: monthsToAdd, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0)) //结果是:相对于currentDate两个月以后的时间 ```####5.事件差计算 >我们使用上面创建的两个时间newDate1 和 newDate2``` var diffDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second], fromDate: newDate1, toDate: newDate2, options: NSCalendarOptions.init(rawValue: 0)) //然后将diffDateComponents的year/day/hour/minute/second打印出来即可 ```