zoukankan      html  css  js  c++  java
  • 日历类NSCalendar

    转自http://www.cnblogs.com/wujian1360/archive/2011/09/05/2168007.html

    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参数为NSWeekdayCalendarUnitinUnit参数为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参数为NSWeekCalendarUnitinUnit参数为NSYearCalendarUnit时,

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

           20051

                             

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

                                          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  

        20051月第一周包括1号。

        a. 如果将minimumDaysInFirstWeek设定 = 1

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

           fromDate传入12-8号,方法均返回2

           fromDate传入19-15号,方法均返回3

           ......

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

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

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

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

           ......

           20081

                             

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

                      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  

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

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

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

           fromDate传入16-12号,方法均返回2

           fromDate传入113-19号,方法均返回3

           ......

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

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

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

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

           ......

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

            的ordinalityOfUnit参数为NSWeekCalendarUnitinUnit参数为NSMonthCalendarUnit时,

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

           20084

                             

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

                      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  

        20084月第一周包括12345号。

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

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

           fromDate传入46-12号,方法均返回2

           fromDate传入413-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

        . 其它请参照firstWeekdayminimumDaysInFirstWeek中的说明


        - (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指定了一个特定的日期。
        如果startDateinterval均为可计算的,那么函数返回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-062008/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天的秒数。

  • 相关阅读:
    Linux下文件属性(drwxr-xr-x)详解以及(-rwxrwxrwx=777)(转)
    Linux中chown和chmod的区别和用法(转)
    以root用户身份在jenkins中运行shell命令
    Java中Properties配置文件读取
    Java分布式服务框架Dubbo初探(待实践)
    Servlet3.0新特性
    Java中System.getProperty()的参数
    Java获取路径的方法分析详解(Application/Web)
    Java中的JAR/EAR/WAR包的文件夹结构说明(转)
    JAR包中的MANIFEST.MF文件详解以及编写规范
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/3026227.html
Copyright © 2011-2022 走看看