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

NSCalendar 日历类的更多相关文章

  1. NSCalenda日历类

    1. //将数据库时间和当前时间相比,得出时间差. + (NSString *)dateDescriptionWithDate:(NSDate *)date{ // NSCalendar日历类,提供了 ...

  2. iOS - OC NSCalendar 日历

    前言 @interface NSCalendar : NSObject <NSCopying, NSSecureCoding> NSCalendar 对世界上现存的常用的历法进行了封装,既 ...

  3. iOS - Swift NSCalendar 日历

    前言 public class NSCalendar : NSObject, NSCopying, NSSecureCoding NSCalendar 对世界上现存的常用的历法进行了封装,既提供了不同 ...

  4. NSCalendar日历

    前言 NSCalendar 对世界上现存的常用的历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算. NSCalendar -- 日历类,它提供了大部分的日期计算接口,并且允许您在NSDat ...

  5. iOS 日历类(NSCalendar)

    对于时间的操作在开发中很常见,但有时候我们需要获取到一年后的时间,或者一周后的时间.靠通过秒数计算是不行的.那就牵扯到另外一个日历类(NSCalendar).下面先简单看一下 NSDate let d ...

  6. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  7. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  8. java基础22 日期类、日历类、日期格式类

    package com.dhb.code; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  9. PHP设计日历类一 (38)

    由两个文件组成: 第一个test.php <style> table { border:1px solid #; } .fontb { color:white; background:bl ...

随机推荐

  1. monkeyrunner对比屏幕局部图像.getSubImage()

    monkeyrunner对比屏幕局部图像.getSubImage() monkeyrunner执行测试时使用.takeSnapshot()截图,默认截取整个屏幕,包含了系统的状态栏.真实手机状态栏中包 ...

  2. ZEN_CART_如何添加自定义页面

    按照下面的路径,添加自己的文件,就OK了 以about us页面为例, 默认模板 \includes\templates\template_default\templates\tpl_about_us ...

  3. drawable文件夹详解

    QVGA使用ldpi,虽然有不同尺寸,但都是120dpi左右:HVGA同理:如下图: -finger    用于触摸屏的设备 -hdpi    近似于240dpi的高级显示密度的屏幕 -mdpi    ...

  4. PADS 导Gerber文件

    PCB也画了好几年,投板时都是直接发PCB文件,突然间客户让我导出Gerber文件, 一时半会还挺棘手的,上网不停的搜啊搜啊,虽然最终还是搞定了,但耽误了不少时间. 现总结下,把所有相关设置一步一步的 ...

  5. Android Security

    Android Security¶ 确认签名¶ Debug签名: $ jarsigner -verify -certs -verbose bin/TemplateGem.apk sm 2525 Sun ...

  6. navicat 导出mysql表结构

    选中需要导出表结构的数据库,右键,在显示的菜单中选择“数据传输”这一项 ,在弹出窗口中“数据传输”单击选择“高级”一项,在“高级”中把“记录选项”中的勾去掉,在做一些设置,最后导出表数据就不会导出记录 ...

  7. java几种常用设计模式简单示例

    1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生.具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有 ...

  8. 转 Android 编程下两种方式注册广播的区别

    常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接收到,它的注册方式就是在你应用程序的AndroidManifast.xml 中进行注册,这种注册方式通常又被称 ...

  9. STM32软件复位(基于库文件V3.5)

    源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...

  10. Split()特殊字符

    关于点的问题是用string.split("[.]") 解决. 关于竖线的问题用 string.split("\\|")解决. 关于星号的问题用 string. ...