NSCalendar

日历类

Cocoa中对日期和时间的处理 NSCalendar (一) (2008-11-12 21:54:10)

NSCalendar用于处理时间相关问题。比如比较时间前后、计算日期所的周别等。

1. 创建或初始化可用以下方法

+ (id)currentCalendar;

取得当前用户的逻辑日历(logical calendar)

+ (id)autoupdatingCurrentCalendar;

取得当前用户的逻辑日历(logical calendar), ......

- (id)initWithCalendarIdentifier:(NSString *)identifier;

初始化为各种日历。identifier的范围可以是:

NSGregorianCalendar 阳历

NSBuddhistCalendar 佛历

NSChineseCalendar 中国日历

NSHebrewCalendar 希伯来日历

NSIslamicCalendar 伊斯兰日历

NSIslamicCivilCalendar 伊斯兰民事日历

NSJapaneseCalendar 日本日历

2. 使用前若有必要可以先做以下设定

- (void)setLocale:(NSLocale *)locale;

设置区域

- (void)setTimeZone:(NSTimeZone *)tz;

设置时区

- (void)setFirstWeekday:(NSUInteger)value;

设定每周的第一天从星期几开始,比如:

.  如需设定从星期日开始,则value传入1

.  如需设定从星期一开始,则value传入2

.  以此类推

详细信息请参阅FirstWeekday属性

- (void)setMinimumDaysInFirstWeek:(NSUInteger)value;

设定作为(每年及每月)第一周必须包含的最少天数,比如:

.  如需设定第一周最少包括7天,则value传入7

详细信息请参阅MinimumDaysInFirstWeek属性

3. 取回设定信息用以下方法

- (NSString *)calendarIdentifier

返回日历标示符(identifier)。有效的日历标示符包括:

NSGregorianCalendar

NSBuddhistCalendar

NSChineseCalendar

NSHebrewCalendar

NSIslamicCalendar

NSIslamicCivilCalendar

NSJapaneseCalendar

- (NSLocale *)locale;

返回日历指定的地区信息。它将影响???

- (NSTimeZone *)timeZone;

返回日历指定的时区信息。它将影响???

- (NSUInteger)firstWeekday;

返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekdayCalendarUnit,inUnit参数为NSWeekCalendarUnit时,

firstWeekday属性影响它的返回值。具体说明如下:

.  当firstWeekday被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:

fromDate传入的参数是星期日,则函数返回1

fromDate传入的参数是星期一,则函数返回2

.  当firstWeekday被指定为其它值时(即 <> 1)时,假设firstWeekday被指定为星期一(即 = 2),那么:

fromDate传入的参数是星期一,则函数返回1

fromDate传入的参数是星期二,则函数返回2

fromDate传入的参数是星期日,则函数返回7

- (NSUInteger)minimumDaysInFirstWeek;

返回日历指定的第一周必须包含的最少天数。缺省为1,即minimumDaysInFirstWeek = 1。

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为NSYearCalendarUnit时,

minimumDaysInFirstWeek属性影响它的返回值。具体说明如下:

2005年1月

日   一   二   三   四   五   六

--------------------------------

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

2005年1月第一周包括1号。

a. 如果将minimumDaysInFirstWeek设定 = 1

则fromDate传入1月1号,方法均返回1  ==> 满足minimumDaysInFirstWeek指定的天数(最少1天),所以方法将其归为2005年的第1周

则fromDate传入1月2-8号,方法均返回2

则fromDate传入1月9-15号,方法均返回3

......

b. 如果将minimumDaysInFirstWeek设定为 > 1,比如2

则fromDate传入1月1号,方法均返回53  ==> 不足2天,所以方法将其归为2004年的第53周

则fromDate传入1月2-8号,方法均返回1

则fromDate传入1月9-15号,方法均返回2

......

2008年1月

日   一   二   三   四   五   六

---------------------------------

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

2005年1月第一周包括1-5号共5天。

a. 如果将minimumDaysInFirstWeek设定为 <= 5时

则fromDate传入1月1-5号,方法均返回1  ==> 满足minimumDaysInFirstWeek指定的天数,所以方法将其归为2008年的第1周

则fromDate传入1月6-12号,方法均返回2

则fromDate传入1月13-19号,方法均返回3

......

b. 如果将minimumDaysInFirstWeek设定为 > 5,比如6

则fromDate传入1月1-5号,方法均返回53  ==> 当周不足6天,所以方法将其归为2007年的第53周

则fromDate传入1月2-8号,方法均返回1

则fromDate传入1月9-15号,方法均返回2

......

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为NSMonthCalendarUnit时,

minimumDaysInFirstWeek属性影响它的返回值。以2008年4月为例, 具体说明如下:

2008年4月

日   一   二   三   四   五   六

---------------------------------

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

2008年4月第一周包括1、2、3、4、5号。

1. 如果将minimumDaysInFirstWeek设定为小于或等于5的数

则fromDate传入4月1-5号,方法均返回1

则fromDate传入4月6-12号,方法均返回2

则fromDate传入4月13-19号,方法均返回3

....

2. 如果将minimumDaysInFirstWeek设定为大于5的数

则fromDate传入1-5号,方法均返回0

则fromDate传入6-12号,方法均返回1

则fromDate传入13-19号,方法均返回2

Cocoa中对日期和时间的处理 NSCalendar (二)

其他方法的说明
    - (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit;
    返回单元的最大范围。就Gregorian来说有:
     NSEraCalendarUnit => 0 - 2
     NSYearCalendarUnit => 1 - 10000
     NSMonthCalendarUnit = 1 - 12
     NSDayCalendarUnit = 1 - 31
     NSHourCalendarUnit = 0 - 24
     NSMinuteCalendarUnit = 0 - 60
     NSSecondCalendarUnit = 0 - 60
     NSWeekCalendarUnit = 1 - 53
     NSWeekdayCalendarUnit = 1 - 7
     NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
                                         (NSNotFound - NSNotFound)

- (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit;
    返回单元的最小范围。就Gregorian来说有:
     NSEraCalendarUnit => 0 - 2
     NSYearCalendarUnit => 1 - 10000
     NSMonthCalendarUnit = 1 - 12
     NSDayCalendarUnit = 1 - 28  ***
     NSHourCalendarUnit = 0 - 24
     NSMinuteCalendarUnit = 0 - 60
     NSSecondCalendarUnit = 0 - 60
     NSWeekCalendarUnit = 1 - 52  ***
     NSWeekdayCalendarUnit = 1 - 7
     NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
                                         (NSNotFound - NSNotFound)

- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
    返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的顺序,比如:
    . 要取得2008/11/12在当月的第几周则可以这样调用该方法:
      [calendar ordinalityOfUnit:NSWeekOrdinalCalendarUnit inUnit: NSWeekCalendarUnit forDate: someDate]; 
      注: someDate存放了2008/11/12

. 要取得1:50分在一天中处于第几个小时,则可以这样调用该方法:
      [calendar ordinalityOfUnit:NSHourCalendarUnit inUnit: NSDayCalendarUnit forDate: someTime]; 
      注: someTime存放了1:50

. 其它请参照firstWeekday和minimumDaysInFirstWeek中的说明

- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
    返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的范围,比如:
    . 要取得2008/11/12在所在月份的日期范围则可以这样调用该方法:
      [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSMonthCalendarUnit forDate:fDate]; 
      则返回1-31。注: fDate存放了2008/11/12

. 要取得2008/02/20在所在月份的日期范围则可以这样调用该方法:
      [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:fDate]; 
      则返回1-29。注: fDate存放了2008/11/12

- (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)sDate interval:(NSTimeInterval *)unitSecs forDate:(NSDate *)date;
    用于返回日期date(参数)所在的那个日历单元unit(参数)的开始时间(sDate)。其中参数unit指定了日历单元,参数sDate用于返回日历单元的第一天,参数unitSecs用于返回日历单元的长度(以秒为单位),参数date指定了一个特定的日期。
    如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.比如:

. 要计算2008/01/08日所在的周的第一天:
        ...
        NSDate *dateOut = [NSDate date];
        NSDate **sDate = &dateOut;
 
        NSDateComponents *dc = [[NSDateComponents alloc] init];
        [dc setYear: 2008];
        [dc setMonth: 1];
        [dc setDay: 8];
       
        NSDate *date = [calendar dateFromComponents:dc];
        NSTimeInterval intOut;
        NSTimeInterval *intervalOut = &intOut;
 
        if ([calendar rangeOfUnit:NSMonthCalendarUnit startDate:sDate interval:interval0 forDate:date]){
            NSLog(@"%@", [*sDate description]);
            NSLog(@"%f", *intervalOut);
        }
        else{
            NSLog(@"Can not be calculated!");
        }
        ...
      在控制台窗口上可以看到:
      2008-01-06 00:00:00 +0800
      604800.000000
      注: 2008-01-06是2008/01/08所在周的第一天,604800是一周7天的秒数。

. 要计算2008/01/05日所在的周的第一天,在控制台窗口上可以看到:
      2007-12-30 00:00:00 +0800
      604800.000000

. 要计算2008/02/06日所在的月的第一天,在控制台窗口上可以看到:
      2007-02-01 00:00:00 +0800
      2505600.000000
      注: 2505600是二月29天的秒数。

Foundation框架-NSCalendar的更多相关文章

  1. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  2. iOS - OC Foundation 框架

    前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...

  3. iOS - Swift Foundation 框架

    前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...

  4. Objective-C Foundation框架

    1.字符串 OC由两个字符串:NSString和NSMutableString,NSString代表字符序列不可变的字符串,而NSMutableString则代表字符序列可变的字符串. 1.1 创建字 ...

  5. OC 知识:Foundation 框架及相关类详尽总结

    本文用来介绍Foundation框架的相关知识,以及Foundation框架所提供类的相关知识总结. 1. 框架介绍 框架是由很多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使开发程序变得更加 ...

  6. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  7. Foundation框架-NSString和NSMutableString

    可变与不可变的字符串 --1-- Foundation框架介绍 1.1 框架介绍 --2-- NSString 2.1 NSString介绍及使用 2.2 NSString创建方式  2.3 从文件中 ...

  8. Core Foundation框架

    转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...

  9. 08OC之Foundation框架

    1.Foundation框架简述 在前面,我们创建一个类的时候,都会选择Cocoa Class.到底Cocoa Class是什么东西呢? Cocoa 不是一门编程语言,因为它可以运行在多种编程语言上, ...

随机推荐

  1. ABAP术语-Function Library

    Function Library 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/14/1068642.html Central reposi ...

  2. ABAP术语-Call Transaction

    Call Transaction 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/15/1039270.html A data transfe ...

  3. 快速玩转linux(1)

    快速上手Linux玩转典型应用 mark 大牛都会使用Linux, Linux命令是行业要求. 商业服务器基本都是linux 开源软件都先支持Linux(只支持) 大数据分析.机器学习首选Linux ...

  4. js面试之一个字符串中出现次数最多的字符是?出现几次?

    最近在找面试题的时候发现了许多有趣的题目,在这里用随笔记录下~ 关于“一个字符串中出现次数最多的字符...”这种问题在笔试题中出现的频率还是很高的,我自己也找到了几种方法处理 var str = &q ...

  5. Java源码解析——集合框架(一)——ArrayList

    ArrayList源码分析 ArrayList就是动态数组,是Array的复杂版本,它提供了动态的增加和减少元素.灵活的设置数组的大小. 一.类声明 public class ArrayList< ...

  6. laravel 基础 --内置函数

    简介 Laravel 自带了一系列 PHP 辅助函数,很多被框架自身使用,如果你觉得方便的话也可以在代码中使用它们. https://laravelacademy.org/post/8967.html ...

  7. HyperLedger Fabric 1.4 架构(6.2)

    6.2.1 架构演进       Fabric架构经历了0.6版本到1.0版本的演进,架构上进行了重大改进,从0.6版本的结构简单演进到可扩展.多通道的设计,在架构上有了质的飞跃:从1.0版本以后,架 ...

  8. RHCE7认证学习笔记17——KickStart安装系统

    一.自动化安装系统工具 1.Cobbler    另一个自动化安装工具: 2.Kickstart 二.使用kickstart自动化安装系统 服务器安装的软件: 1.dhcp服务   [root@lin ...

  9. HI2115软件开发板V150版本AT+NSOST指令

    1. 在HI2115里面,由于内存空间比较大,所以支持UDP发送指令AT+NSOST的分包 ret = sendto(socket, seq_num, data_string, length, msg ...

  10. github简单使用教程(转)

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...