Swift编程(七):全面学习NSDate的相关知识

个人项目

个人站点:LN电影网
个人博客:L&N博客

写在前面

欢迎大家关注我的个人博客:博客地址,这里主要是我在个人开发时候遇到的坑和挖完的坑,包括 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打印出来即可
```

你可能感兴趣的:(Swift编程(七):全面学习NSDate的相关知识)