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

相關文章
相關標籤/搜索