#iOS 时间那点事
##NSDate分类(Catogery)
###分类
- 类,是面向对象语言的基本;类,是具有相同属性和行为的一类事物的概括,这是一种抽象;但是,事物总是多方面的,如此之多以至于我们每每看到深不见底的头文件就恐高,于是乎我们使用了继承,鉴于管理和使用的高额成本,我们创造了“抽象工厂模式”,Perfect!但我们怎么有时心里就是高兴不起来呢?因为有些时候可以不用继承,但是又没有其他办法,只好用继承,并且不得不承担使用继承的带来的后果。Objective-C就在这时来到了你的身边。[单继承!!??什么东西?(C++)] [还不是跟我们一样~(Java)]。关于单继承和多继承的问题,作为一介平民,不做过多讨论,用着用着就习惯了…… 全世界针对这个问题给出了同样的答案:接口(和Objective-C中的协议一样的东西)。这就结束了吗??!!类还是深不见底啊!那就彻底一次吧,不要磨磨唧唧的了,一个类可以分开定义和实现,放到多个的文件里,这样把基本的东西留在原来的文件中,其他比较特定的东西放到其他文件里面,搞个合理的命名规则,就叫“分类”吧。
- 分类,通过分离特定功能的代码,解决大型代码框架的维护的问题。任何东西的出现都是有其一定的原因的,就像面向对象语言的出现一样,我们现在只不过是在不断地完善面向对象语言而已,可见前方的路还很远。
- NSDate是一个时间类,存储的仅仅是一个相对于GTM2001年1月1日0时0分0秒的一个时间偏差(单位:秒)。但是,我们在心中对NSDate不是这样想想的,在我们心中NSDate就是一个万能的时间类,通过它可以直接知道年月日时分秒星期等等和时间相关的东西。但是NSDate的定义是如此的简洁,我们想说它怎么这么鸡肋,但是想想它确实该这么鸡肋。但是,我们心中美好的梦想就这样破灭了吗???!!!算了,试试“分类”这个东西吧~
###NSDate (JBCommon)
- 我们现在像添加的功能在我们心中是很基本的,只是获取年,月,日,时,分,秒,星期。因此我们把分类的名字命名为Common,但是想想看,肯定有人跟我想的一样,怎么办呢,总不能名字一样吧,那就加个前缀吧。我一般用JustBen,缩写JB(这是英文的缩写!!),因此我的分类就是NSDate (JBCommon)。
- 现在开始,就要开始真正的编码之旅了,没准备好的看看这个:
####表明决心! 头文件,是我们表明决心地方。年,月,日,时,分,秒,星期
<!-- lang: cpp -->
// NSDate+JBCommon.h
@interface NSDate (JBCommon)
/****************************************************
*@Description:获得NSDate对应的年份
*@Params:nil
*@Return:NSDate对应的年份
****************************************************/
- (NSUInteger)year;
/****************************************************
*@Description:获得NSDate对应的月份
*@Params:nil
*@Return:NSDate对应的月份
****************************************************/
- (NSUInteger)month;
/****************************************************
*@Description:获得NSDate对应的日期
*@Params:nil
*@Return:NSDate对应的日期
****************************************************/
- (NSUInteger)day;
/****************************************************
*@Description:获得NSDate对应的小时数
*@Params:nil
*@Return:NSDate对应的小时数
****************************************************/
- (NSUInteger)hour;
/****************************************************
*@Description:获得NSDate对应的分钟数
*@Params:nil
*@Return:NSDate对应的分钟数
****************************************************/
- (NSUInteger)minute;
/****************************************************
*@Description:获得NSDate对应的秒数
*@Params:nil
*@Return:NSDate对应的秒数
****************************************************/
- (NSUInteger)second;
/****************************************************
*@Description:获得NSDate对应的星期
*@Params:nil
*@Return:NSDate对应的星期
****************************************************/
- (NSUInteger)weekday;
@end
####一起冒险吧! 任何惊喜在这之前都是空虚的,而现在,我们要让“她”变成现实。
我们慢慢来……
-
怎么获取年份呢?NSDateFomatter?还是NSCalendar+NSDateComponents?NSDateFomatter尽管简单,但就是感觉这么不正统呢;NSCalendar+NSDateComponents是不是太麻烦了?用哪个呢? 要知道,我们可是在做“伟大”的事情,当然要用NSCalendar+NSDateCompoents!
-
要实现一个NSDateComponents对象,然后获取年月日时分秒星期,好像还可以获取其他好些东西!!不错!这样所有的NSDate都可以使用这个NSDateComponents对象了!等等,我们是不是要把NSDateComponents对象搞成静态的,这样就真是所有的NSDate对象用这一个NSDateComponents对象了。于是乎一个经过深思熟虑的伟大的方法产生了:
<!-- lang: cpp --> /********************************************************** *@Description:获取当天的包括“年”,“月”,“日”,“周”,“时”,“分”,“秒”等的NSDateComponents *@Params:nil *@Return:当天的包括“年”,“月”,“日”,“周”,“时”,“分”,“秒”等的NSDateComponents ***********************************************************/ - (NSDateComponents *)componentsOfDay { static NSDateComponents *dateComponents = nil; static NSDate *previousDate = nil; static NSCalendar *greCalendar; if (!greCalendar) { greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; } if (!previousDate || ![previousDate isEqualToDate:self]) { previousDate = self; dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit | NSWeekCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit| NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:self]; } return dateComponents; }
我们这里设置dateComponents的components属性的时候把以后可能会用到的都加上了,大家请自便哦~ 3. 有了伟大的2,3就简单多了。直接贴上代码!
<!-- lang: cpp -->
// NSDate+JBCommon.m
#import "NSDate+Calendar.h"
@implementation NSDate (Calendar)
/**********************************************************
*@Description:获取当天的包括“年”,“月”,“日”,“周”,“时”,“分”,“秒”的NSDateComponents
*@Params:nil
*@Return:当天的包括“年”,“月”,“日”,“周”,“时”,“分”,“秒”的NSDateComponents
***********************************************************/
- (NSDateComponents *)componentsOfDay
{
static NSDateComponents *dateComponents = nil;
static NSDate *previousDate = nil;
static NSCalendar *greCalendar;
if (!greCalendar) {
greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
}
if (!previousDate || ![previousDate isEqualToDate:self]) {
previousDate = self;
dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit | NSWeekCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit| NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:self];
}
return dateComponents;
}
/****************************************************
*@Description:获得NSDate对应的年份
*@Params:nil
*@Return:NSDate对应的年份
****************************************************/
- (NSUInteger)year
{
return [self componentsOfDay].year;
}
/****************************************************
*@Description:获得NSDate对应的月份
*@Params:nil
*@Return:NSDate对应的月份
****************************************************/
- (NSUInteger)month
{
return [self componentsOfDay].month;
}
/****************************************************
*@Description:获得NSDate对应的日期
*@Params:nil
*@Return:NSDate对应的日期
****************************************************/
- (NSUInteger)day
{
return [self componentsOfDay].day;
}
/****************************************************
*@Description:获得NSDate对应的小时数
*@Params:nil
*@Return:NSDate对应的小时数
****************************************************/
- (NSUInteger)hour
{
return [self componentsOfDay].hour;
}
/****************************************************
*@Description:获得NSDate对应的分钟数
*@Params:nil
*@Return:NSDate对应的分钟数
****************************************************/
- (NSUInteger)minute
{
return [self componentsOfDay].minute;
}
/****************************************************
*@Description:获得NSDate对应的秒数
*@Params:nil
*@Return:NSDate对应的秒数
****************************************************/
- (NSUInteger)second
{
return [self componentsOfDay].second;
}
/****************************************************
*@Description:获得NSDate对应的星期
*@Params:nil
*@Return:NSDate对应的星期
****************************************************/
- (NSUInteger)weekday
{
return [self componentsOfDay].weekday;
}
@end
这一节也告一段落了~ 哈哈~
######多谢大家的提醒,已将[NSCalendar currentCalendar]改为了[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]。