NSDateComponents
NSDateComponents类的作用是把日期拆分成一个一个的组件。一个日期是由年月日时分秒组成的,该类可以把日期拆分成单独的年、月、日、时、分、秒。通常是和NSCalendar类一起使用。
初始化方法
- - (instancetype)init
默认的初始化方法
1 | // 创建NSDateComponents对象,设置时间点 |
用法一
获取一个绝对的时间点对象
1 | NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; |
log信息如下:
2017-05-06 00:00:00 +0000
用法二
在date基础上,增加一个NSDateComponents类型的时间增量
1 | NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; |
如果现在的时间是:2017-03-26 02:21:08 +0000
那么打印结果就是:2017-03-29 02:21:08 +0000
在当前时间基础上增加3天。不过这是格林尼治时区的时间,可以转化为当前东8区的时间
1 | NSTimeZone *zone = [NSTimeZone systemTimeZone]; |
常用方法
下面这些方法都是属于NSCalendar类的,都返回一个NSDateComponents类。
- - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
取得一个NSDate对象的1个或多个部分,结果用NSDateComponents来封装
1 | NSCalendar *calendar = [NSCalendar currentCalendar]; |
需要注意的是,只有明确指定了unitFlags,NSDateComponents相应的那部分才有值。
年、月、日可以正常取到值,weekday则取不到正常值。
- - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate \)resultDate options:(NSCalendarOptions)opts;
取得两个NSDate对象的时间间隔,结果用NSDateComponents来封装
1 | NSDate *date1 = [NSDate date]; |
day、second可以正常取到值,year则取不到正常值。
注意:
1)得到的NSDateComponents对象可能会包含负数。例如:当toDate比fromDate晚10秒,second部分返回10;当toDate比fromDate早10秒,second部分返回-10
2)当指定unitFlags返回多个部分时,相隔的时间由多个部分共同组成(不是独立去表示)。例如:上面的例子时间相差24时15秒,如果指定只返回second部分,将得到86415秒;如果指定返回day和second部分,将得到1天15秒;如果指定返回hour、minute和second,将得到24时0分15秒。
NSCalendar
NSCalendar对世界上现存的常用历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算。
初始化方法
- + (id)currentCalendar
获取当前客户端的逻辑日历
1 | NSCalendar *calendar = [NSCalendar currentCalendar]; |
log信息显示:
gregorian
表示客户端当前是公历
- - (nullable id)initWithCalendarIdentifier:(NSCalendarIdentifier)ident
根据日历标示符来初始化日历对象
1 | NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese]; |
log信息显示:
chinese
表示中国农历
系统中定义的有:
NSGregorianCalendar –公历
NSBuddhistCalendar –佛教日历
NSChineseCalendar –中国农历
NSHebrewCalendar –希伯来日历
NSIslamicCalendar –伊斯兰日历
NSIslamicCivilCalendar –伊斯兰教日历
NSJapaneseCalendar –日本日历
NSRepublicOfChinaCalendar –中华民国日历(台湾)
NSPersianCalendar –波斯日历
NSIndianCalendar –印度日历
NSISO8601Calendar – ISO8601
常用方法
- - (void)setLocale:(NSLocale *)locale
设置本地化信息
1 | NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; |
log信息显示:
zh_CN
- - (void)setTimeZone:(NSTimeZone *)tz
设置时区信息
1 | NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; |
log信息显示:
Asia/Shanghai (GMT+8) offset 28800
- - (void)setFirstWeekday:(NSUInteger)weekday
设置每周的第一天从星期几开始,如:1代表星期一开始,2代表星期二开
始,以此类推。默认值是1。
1 | NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; |
- - (void)setMinimumDaysInFirstWeek:(NSUInteger)mdw
设置每年及每月第一周必须包含的最少天数, 如:设定第一周最少包括3天,则value传3。
1 | NSCalendar *calendar = [NSCalendar currentCalendar]; |
NSDateFormatter
NSDateFormatter的日期格式如下
1 | G --纪元 |
NSDateFormatter的两个最实用的方法是dateFromString和stringFromDate,前者将字符串经过格式化后变成NSDate对象,后者将NSDate对象格式化成字符串。
常用方法
- setDateFormat
在调setDateFormat设置格式化字符串时,可以使用单
引号来引入其他字符串。
1 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
log信息显示:
2017-03-26 I Love China! 18:45:14
- dateFromString
使用NSDateFormatter转换时间字符串时,默认的时区是系统时区,例如在中国都是北京时间(+8),如果直接转换会导致结果相差8小时,所以一般的做法是先指定时区为GMT标准时间再转换。
1 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
log信息显示:
2017-03-26 18:45:14