iOS时间那点事--NSDate分类

#iOS 时间那点事

##NSDate分类(Catogery)

###分类

  1. 类,是面向对象语言的基本;类,是具有相同属性和行为的一类事物的概括,这是一种抽象;但是,事物总是多方面的,如此之多以至于我们每每看到深不见底的头文件就恐高,于是乎我们使用了继承,鉴于管理和使用的高额成本,我们创造了“抽象工厂模式”,Perfect!但我们怎么有时心里就是高兴不起来呢?因为有些时候可以不用继承,但是又没有其他办法,只好用继承,并且不得不承担使用继承的带来的后果。Objective-C就在这时来到了你的身边。[单继承!!??什么东西?(C++)] [还不是跟我们一样~(Java)]。关于单继承和多继承的问题,作为一介平民,不做过多讨论,用着用着就习惯了…… 全世界针对这个问题给出了同样的答案:接口(和Objective-C中的协议一样的东西)。这就结束了吗??!!类还是深不见底啊!那就彻底一次吧,不要磨磨唧唧的了,一个类可以分开定义和实现,放到多个的文件里,这样把基本的东西留在原来的文件中,其他比较特定的东西放到其他文件里面,搞个合理的命名规则,就叫“分类”吧。
  2. 分类,通过分离特定功能的代码,解决大型代码框架的维护的问题。任何东西的出现都是有其一定的原因的,就像面向对象语言的出现一样,我们现在只不过是在不断地完善面向对象语言而已,可见前方的路还很远。
  3. NSDate是一个时间类,存储的仅仅是一个相对于GTM2001年1月1日0时0分0秒的一个时间偏差(单位:秒)。但是,我们在心中对NSDate不是这样想想的,在我们心中NSDate就是一个万能的时间类,通过它可以直接知道年月日时分秒星期等等和时间相关的东西。但是NSDate的定义是如此的简洁,我们想说它怎么这么鸡肋,但是想想它确实该这么鸡肋。但是,我们心中美好的梦想就这样破灭了吗???!!!算了,试试“分类”这个东西吧~

###NSDate (JBCommon)

  1. 我们现在像添加的功能在我们心中是很基本的,只是获取年,月,日,时,分,秒,星期。因此我们把分类的名字命名为Common,但是想想看,肯定有人跟我想的一样,怎么办呢,总不能名字一样吧,那就加个前缀吧。我一般用JustBen,缩写JB(这是英文的缩写!!),因此我的分类就是NSDate (JBCommon)。
  2. 现在开始,就要开始真正的编码之旅了,没准备好的看看这个:
    1. iOS时间那点事--NSDate
    2. iOS时间那点事--NSDateFormatter
    3. iOS时间那点事--NSTimeZone
    4. iOS时间那点事--NSLocale
    5. iOS时间那点事--NSCalendar NSDateComponents

####表明决心! 头文件,是我们表明决心地方。年,月,日,时,分,秒,星期

<!-- 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

####一起冒险吧! 任何惊喜在这之前都是空虚的,而现在,我们要让“她”变成现实。

我们慢慢来……

  1. 怎么获取年份呢?NSDateFomatter?还是NSCalendar+NSDateComponents?NSDateFomatter尽管简单,但就是感觉这么不正统呢;NSCalendar+NSDateComponents是不是太麻烦了?用哪个呢? 要知道,我们可是在做“伟大”的事情,当然要用NSCalendar+NSDateCompoents!

  2. 要实现一个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]。

转载于:https://my.oschina.net/yongbin45/blog/156386

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值