您的位置:首页 > 移动开发 > Objective-C

objective-C之NSDate相关类(四)

2016-06-13 12:04 363 查看
2.NSCalendar  日历类

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

   2>创建或初始化

      + (id)currentCalendar;

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

     + (id)autoupdatingCurrentCalendar;

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

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

           初始化为各种日历。

         identifier的范围可以是:

                NSGregorianCalendar 阳历

                NSBuddhistCalendar 佛历

                NSChineseCalendar 中国日历

                NSHebrewCalendar 希伯来日历

                NSIslamicCalendar 伊斯兰日历

                NSIslamicCivilCalendar 伊斯兰民事日历

                NSJapaneseCalendar 日本日历

   3>使用前若有必要可以先做以下设定

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

           设置区域

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

           设置时区

      - (void)setFirstWeekday:(NSUInteger)value;

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

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

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

      - (void)setMinimumDaysInFirstWeek:(NSUInteger)value;

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

          如需设定第一周最少包括7天,则value传入7
   4> 取回设定信息用以下方法

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

       ....

  5> 其他方法的说明

     - (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天的秒数。

详情可参考:打开链接

3.NSTimeZone

  **时区是一个地理名字,是为了克服各个地区或国家之间在使用时间上的混乱。
1>了解

GMT 0:00 格林威治标准时间; UTC +00:00 校准的全球时间; CCD +08:00 中国标准时间

夏时制,英文"DaylightSavingTime"。夏季时将时区内的时间提前(一般为1小时),以节省资源,提高效率。使用夏时制期间,当前时区相对于GMT的时间偏移量会发生变化。在某些应用中可能需要考虑。

任何时区都以GMT为基准,即,任何NSTimeZone对象所代表的时区都是相对于GMT的,这里的相对性是NSTimeZone中最重要的属性,我们称之为当前时区相对于GMT的偏移量。一旦知道了一个偏移量,便可以确定一个时区。在iOS中,偏移量是以"秒"为单位的。

2>NSTimerZone介绍

NSTimeZone是一个类簇,我们所使用的任何NSTimeZone对象都是NSTimeZone的私有子类。

iOS中的时间类NSDate中存储的时间,都是相对于GMT的,我们使用NSDate时,会根据App的时区设置返回与时区对应的数据。

iOS系统中的/usr/share/zoneinfo/目录中保存了所有的可根据 地理位置名称 或 时区别名 得到的时区信息。时区别名都是与具体的地理位置一一对应的。(已越狱的童鞋请看)

iOS中的时区表示方法:GMT+0800 GMT-0800。(+:东区 -:西区 08:小时数 00:分钟数)。 GMT+0830就是指比GMT早8小时外加30分钟的时区。

详情请参考:打开链接

4.NSLocale

  1)了解

   若你只开发中国区的应用,需要保证用户修改当前语言环境时应用的显示不发生变化。而像NSDateFormatter这样的类,会根据设备的设置,自动返回不同语言的数据。为了保证返回数据的语言一致,我们需要设置NSLocale。 下面的代码就可以保证在任何语言环境下,只返回中文的数据:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
NSDateFormatter *secondDateFormatter = [[NSDateFormatter alloc] init];
[secondDateFormatter setDateFormat:@"cccc"];
secondDateFormatter.locale = locale;
NSDate *date = [NSDate date];
NSLog(@"%@", [secondDateFormatter stringFromDate:date]);

作为大家都不常用的一个类,NSLocale类是将与国家和语言相关的信息进行简单的组合,包括货币,文学方面的信息。 货币:货币的国际名称(人民币的国际货币名称是CNY);货币符号(人民币的国际货币符号是¥) 文学:标点符号,文字的书写顺序(左右顺序),引用的起止符号等等 若做金融一类的应用可能会用到NSLocale这个类。
  2)基本的用法

     1.获取国家、货币、语言地区编码

       +ISOCountryCodes//所有的ISO定义的国家地区编码

       +ISOCurrencyCodes//所有的ISO定义的货币编码

       +ISOLanguageCodes//所有ISO定义的语言编码

       以上我们可以用NSLog打印出来看一看。

    2. 监听用户本地化的设置信息

           FOUNDATION_EXPORT NSString * constNSCurrentLocaleDidChangeNotification NS_AVAILABLE(10_5,2_0);

    3. 获取当前系统设置语言的标识符

           [[NSLocalecurrentLocale]localeIdentifier];

详情请参考:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: