个人项目
个人站点:<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>