NSDate的基本用法

1.NSDate对象转成格式化的字符串对象

//通过 NSDate 获取当前日期
let currentDate = NSDate()

// NSDateFormatter 转换日期和字符串的工具
let dateFormatter = NSDateFormatter()

1.1 设置区域

dateFormatter.locale = NSLocale.currentLocale()
如果要设置日期为其他区域
//比如设置成希腊
dateFormatter.locale = NSLocale(localeIdentifier:"el_GR")

1.2 设置日期格式
有两种方式可以设置日期格式:一种是通过一些预定义的日期格式化样式(style);另外一种是通过某些说明符来手动设置日期格式。

首先我们先使用 NSDateFormatterStyle 设置日期格式。

//完整样式
dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
var convertedDate = dateFormatter.stringFromDate(currentDate)
Tuesday, October 12, 2017

//长样式
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
October 12, 2017

//中长样式
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
Otc 12,2017

//短样式
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
10/9/17

使用日期说明符来设置日期格式

EEEE:“星期”的全名(比如Monday)。如需缩写,指定1-3个字符(如E,EE,EEE代表Mon)。
MMMM:“月份”的全名(比如October)。如需缩写,指定1-3个字符(如M,MM,MMM代表Oct)。
dd:某月的第几天(例如,09或15)
yyyy:四位字符串表示“年”(例如2015)
HH:两位字符串表示“小时”(例如08或19)
mm:两位字符串表示“分钟”(例如05或54)
ss:两位字符串表示“秒”
zzz:三位字符串表示“时区”(例如GMT)。缩写 Z
GGG:公元前BC或公元后AD
dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy"
convertedDate = dateFormatter.stringFromDate(currentDate)

dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
convertedDate = dateFormatter.stringFromDate(currentDate)

2.将格式化的字符串通过date formatter转换成 NSDate 对象

//示例1
var dateAsString = "24-08-2016 10:49"
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var newDate = dateFormatter.dateFromString(dateAsString)
//示例2
dateAsString = "Thu, 08 Oct 2015 09:22:33 GMT"
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
newDate = dateFormatter.dateFromString(dateAsString)

使用 NSDateComponents 还可以单独获取某一项的值,例如,星期、月份、时间、小时等。
想要实现此功能呢,需要用到 NSCalendar 类 ,NSDateComponents 类经常和 NSCalendar 类搭配使用,NSCalendar 真正执行 NSDate 和 NSDateComponents 间的转换。这样,我们先要获取当前的calendar。

let calendar = NSCalendar.currentCalendar()

首先我们先来看一个 NSDate 到 NSDateComponents转换的具体例子

let dateComponents = calendar.components([NSCalendarUnit.Day, NSCalendarUnit.Month,NSCalendarUnit.Year,NSCalendarUnit.WeekOfYear,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second,NSCalendarUnit.Nanosecond], fromDate: currentDate)
print("day = \(dateComponents.day)", "month = \(dateComponents.month)", "year = \(dateComponents.year)",  "week of year = \(dateComponents.weekOfYear)", "hour = \(dateComponents.hour)",  "minute = \(dateComponents.minute)", "second = \(dateComponents.second)","nanosecond = \(dateComponents.nanosecond)" , separator: ", ", terminator: "")

date components转换到date对象

let components = NSDateComponents()
components.day = 5
components.month = 01
components.year = 2016
components.hour = 19
components.minute = 30
newDate = calendar.dateFromComponents(components)

3.比较日期和时间

首先先创建两个自定义的日期对象

dateFormatter.dateFormat = "MMMM dd, yyyy zzz"
dateAsString = "Oct 08, 2015 GMT"
var date1 = dateFormatter.dateFromString(dateAsString)!

dateAsString = "Oct 10. 2015 GMT"
var date2 = dateFormatter.dateFromString(dateAsString)!

第一种方法
earlierDate: 判断一个日期是否早于另外一个日期
laterDate: 判断一个日期是否晚于另外一个日期
isEqualToDate:判断两个日期是否相等

print("Earlier date is:\(date1.earlierDate(date2))")
print("Later date is:\(date1.laterDate(date2))")
print("dates is Same:\(date1.isEqualToDate(date2))")

第二种方法
NSDate 的 compare: 方法,它需要搭配使用 NSComparisonResult 枚举体


if date1.compare(date2) == NSComparisonResult.OrderedDescending {

    print("Date1 is Later than Date2")
} else if date1.compare(date2) == NSComparisonResult.OrderedAscending {

    print("Date1 is Earlier than Date2")
} else if date1.compare(date2) == NSComparisonResult.OrderedSame {

    print("Same dates")
}

第三种方法
计算每个日期到现在的时间间隔来判断

if date1.timeIntervalSinceReferenceDate > date2.timeIntervalSinceReferenceDate {
    
    print("Date1 is Later than Date2")

} else if date1.timeIntervalSinceReferenceDate < date2.timeIntervalSinceReferenceDate {
    
    print("Date1 is Earlier than Date2")

} else {

    print("Same dates")

}

4.计算时间间隔

首先自定义两个NSDate对象

dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateAsString = "2015-10-08 14:25:37"
date1 = dateFormatter.dateFromString(dateAsString)!

dateAsString = "2018-03-05 08:14:19"
date2 = dateFormatter.dateFromString(dateAsString)!

第一种方法
使用 components:fromDate:toDate:options: ,第一个参数是 NSCalendarUnit 值的数组。这里要注意,如果第一个日期如果晚于第二个日期,则结果会返回负值。

var diffDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second], fromDate: date1, toDate: date2, options: NSCalendarOptions.init(rawValue: 0))
print("The difference between dates is: \(diffDateComponents.year) years, \(diffDateComponents.month) months, \(diffDateComponents.day) days, \(diffDateComponents.hour) hours, \(diffDateComponents.minute) minutes, \(diffDateComponents.second) seconds")

剩下的两种方法都用到了 NSDateComponentsFormatter 类,它提供了多种用于自动计算日期间隔的方法,并可以返回格式化字符串结果。首先,我们创建一个date components formatter对象,这里只指定一个属性:

let dateComponentsFormatter = NSDateComponentsFormatter()
dateComponentsFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full

unitsStyle 属性指定我们使用的 dateComponentsFormatter 以何种格式打印日期的间隔。例如,这里我们使用 完整 样式,这样天数、月数等名字(如days,months)都会被显示出来。如果我们设置 缩写 样式,就会显示缩写名字(天数显示为d等)。你可以在 这个链接 中查找到所有的样式:让我们继续会到日期间隔计算的话题上。我们先计算日期的间隔,再把该值传递给stringFromTimeInterval:方法,这样,就能获得日期间隔的字符串表示:

let interval = date2.timeIntervalSinceDate(date1)
dateComponentsFormatter.stringFromTimeInterval(interval)

最后,第三种计算的方法中,我们将两个日期传递给 NSDateComponentsFormatter 对象的一个叫 stringFromDate:toDate: 的方法。但是这个方法需要有个前置的条件:NSDateComponentsFormatter 的 allowedUnits 属性必须被提前设置,这个属性接受数组类型的值,这里至少要设置一个日历单元的值。否则这个方法会返回nil值。所以,在这个方法的使用中,我们“告诉”它需要获取哪些日历单元,它会按照对应的日历单元返回结果:

dateComponentsFormatter.allowedUnits = [NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second]
let autoFormattedDifference = dateComponentsFormatter.stringFromDate(date1, toDate: date2)

感谢原作者的文章:这是一篇写给新手的NSDate教程(Swift版)

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

推荐阅读更多精彩内容