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

个人项目

个人站点:<a href="http://film.noasis.cn">LN电影网</a>
个人博客:<a href="http://blog.noasis.cn">L&N博客</a>

写在前面

欢迎大家关注我的个人博客:<a href="http://blog.noasis.cn" >博客地址</a>,这里主要是我在个人开发时候遇到的坑和挖完的坑,包括 PHP CentOS 以及 Swift 等相关只是

最近一直在搞岗位竞聘,虽然没有成功,但也算一次不错的经历,有些东西还是要看开些比较好;好啦,一个多周没有碰Swift手有点生,找了一个关于日期教程学习整理了一下(灵感来自:swift.gg)
其实这篇博文准备写很久了,奈何工作确实有点忙,搞得自己有点晕头转向,后面还有一个关于NSDate的拓展库,我会在后面的博客中写出来教大家如何深入学习NSDate的实战开发。
下面就开始写吧。

目标:

  • 认识NSDate
  • 学习NSDateFormatter
  • 学习NSCalendar和NSDateComponents
  • 学习日期比较和计算

学习NSDate

1.一个简单的NSDate

<pre>```
//获取当前时间
let currentDate = NSDate()


####2.NSDateFormatter的介绍
NSDate <--> String转换(dateFromString和stringFromDate),并且可以设置NSDate输出的多种属性:日期区域、日期格式(完整或省略格式)和日期形式(2015年-12月19日 或 2015-12-19 01:11等展示形式)


 - 设置区域(locale)

<pre>```
let dateFormatter = NSDateFormatter()
//设置locale两种方式:
dateFormatter.locale = NSLocale.currentLocale()
dateFormatter.locale = NSLocale(localeIdentifier: "el_GR")//希腊
```</pre>

 - 设置日期格式(NSDateFormatterStyle)

<pre>```
//设置格式为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"
*/
```</pre>

 - 设置日期形式(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个字母表示时区

<pre>```
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"

```</pre>

- dateFromString的使用

>上面的操作都是设置NSDate的格式使用stringFromDate方法,获得对应字符串(String)下面通过dateFromString活的NSDate

<pre>```
//注意设置的日期格式要跟字符串的日期格式保持一致
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"
```</pre>

####3.NSDateComponents介绍

- 介绍各种日期组件

<pre>```
/*
Year: 年
Month: 月
Weekday:星期
Day:日
Hour: 时
Minute: 分
Second: 秒
Nanoscond:微秒
WeekOfYear:一年中的第几个星期
WeekOfMonth:一个月中的第几个星期
WeekdayOrdinal:未知
*/
```</pre>

- NSCalendar介绍

>NSCalendar:实现NSDate到NSDateComponents对象的转换

- 实现NSDate -->NSDateComponents

<pre>```
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"

```</pre>

- 实现NSDateComponents --> NSDate

<pre>```
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"
```</pre>

####4.日期比较

我主要推荐两种官方方式:(earlierDate与laterDate)和compare

- 两种方式创建日期

<pre>```
//结合前面学到的使用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)!
```</pre>

- earlierDate与laterDate实现比较

>原理:
earlierDate:
1.如果date1对象比date2早,那么返回date1,反之返回date2
2.如果两者相等,则返回date1
laterDate:反之

<pre>```
if newDate1 == newDate1.earlierDate(newDate2){
    print("newDate1不晚于newDate2")
} else {
    print("newDate1晚于newDate2")
}

if newDate1 == newDate1.laterDate(newDate2) {
    print("newDate1不早于newDate2")
} else {
    print("newDate1早于newDate2")
}
```</pre>

>很明显上面两个事件相等,则返回值是"newDate1不晚于newDate2"和"newDate1不早于newDate2"
如果讲上面的newComponents.second = 10,这样明显就是newDate1早了,在看下结果:"newDate1不晚于newDate2\n"和"newDate1比newDate2早\n"

- compare方法

>原理:newDate1.compare(newDate2)得到的结果是一个NSComparisonResult枚举类型中的元素
NSComparisonResult:
OrderedDescending:降序,说明前一个时间大
OrderedAscending:升序,说明前一个时间小
OrderedSame:相等,时间相同

<pre>```
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同时")
}
```</pre>

####4.时间计算

>先简单看一个添加月份的例子

<pre>```
let currentDate = NSDate() //当前时间
let monthsToAdd = 2
var calculatedDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Month, 
value: monthsToAdd, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0))
//结果是:相对于currentDate两个月以后的时间
```</pre>

####5.事件差计算

>我们使用上面创建的两个时间newDate1 和 newDate2

<pre>```
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打印出来即可
```</pre>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容