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

示例

头文件。年,月,日,时,分,秒,星期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// 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对象了。于是乎一个经过深思熟虑的伟大的方法产生了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**********************************************************
*@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属性的时候把以后可能会用到的都加上了,大家请自便哦~

  1. 有了伟大的2,3就简单多了。直接贴上代码!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// 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