iOS时间那点事--NSDate分类

#iOS 时间那点事框架

##NSDate分类(Catogery)编码

###分类.net

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

###NSDate (JBCommon)code

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

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

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

####一块儿冒险吧! 任何惊喜在这以前都是空虚的,而如今,咱们要让“她”变成现实。orm

咱们慢慢来……对象

  1. 怎么获取年份呢?NSDateFomatter?仍是NSCalendar+NSDateComponents?NSDateFomatter尽管简单,但就是感受这么不正统呢;NSCalendar+NSDateComponents是否是太麻烦了?用哪一个呢? 要知道,咱们但是在作“伟大”的事情,固然要用NSCalendar+NSDateCompoents!blog

  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]。

相关文章
相关标签/搜索