NSCalendar 日历

前言

  • NSCalendar 日历

    • Objective-C

      1
      @interface NSCalendar : NSObject <NSCopying, NSSecureCoding>
    • Swift

      1
      public class NSCalendar : NSObject, NSCopying, NSSecureCoding
    • NSCalendar 对世界上现存的常用的历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算。

      • NSCalendar – 日历类,它提供了大部分的日期计算接口,并且允许您在NSDate和NSDateComponents之间转换
      • NSTimeZone – 时区信息
      • NSLocale – 本地化信息
      • NSDate – 表示一个绝对的时间点
      • NSDateComponents – 一个封装了具体年月日、时秒分、周、季度等的类
      • NSDateFormatter – 用来在日期和字符串之间转换
    • firstWeekday

      • 大家在使用 dateComponents.weekday 获取某天对应的星期时,会发现,星期日对应的值为 1,星期一对应的值为 2,星期二对应的值为 3,依次递推,星期六对应的值为 7,这与我们平时理解的方式不一样。然后,我们就开始找是不是可以设置这种对应关系。终于,我们在 NSCalendar 中发现了 firstWeekday 这个变量,从字面意思上看貌似就是我们寻找的那个东西。可是,设置过 firstWeekday 后,我们又发现完全没有作用,真是郁闷啊!其实,大家不必郁闷,因为郁闷也没用,iOS 中规定的就是周日为 1,周一为 2,周二为 3,周三为 4,周四为 5,周五为 6,周六为 7,无法通过某个设置改变这个事实的,只能在使用的时候 注意一下这个规则了。那 firstWeekday 是干什么用的呢?大家设置一下 firstWeekday,再获取一下 dateComponents.weekOfYear 或 dateComponents.weekOfMonth,看看返回的数据是否发生了变化。firstWeekday 的作用确实是修改当前历法中周的起始位置,但是不能修改周日对应的数值,只能修改一年或一个月中周的数量,以及周的次序。

1、日历的创建

  • Objective-C

    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
    // 根据提供的日历标示符初始化。
    /*
    identifier 的范围可以是:

    NSCalendarIdentifierGregorian 公历
    NSCalendarIdentifierBuddhist 佛教日历
    NSCalendarIdentifierChinese 中国农历
    NSCalendarIdentifierHebrew 希伯来日历
    NSCalendarIdentifierIslamic 伊斯兰日历
    NSCalendarIdentifierIslamicCivil 伊斯兰教日历
    NSCalendarIdentifierJapanese 日本日历
    NSCalendarIdentifierRepublicOfChina 中华民国日历(台湾)
    NSCalendarIdentifierPersian 波斯历
    NSCalendarIdentifierIndian 印度日历
    NSCalendarIdentifierISO8601 ISO8601
    */
    NSCalendar *cal1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    // 返回当前客户端的逻辑日历
    /*
    取得的值会一直保持在 cache 中,第一次用此方法实例化对象后,即使修改了系统日历设定,这个对象也不会改变
    */
    NSCalendar *cal2 = [NSCalendar currentCalendar];

    // 返回当前客户端的逻辑日历
    /*
    当每次修改系统日历设定,其实例化的对象也会随之改变
    */
    NSCalendar *cal3 = [NSCalendar autoupdatingCurrentCalendar];
  • Swift

    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
    // 根据提供的日历标示符初始化。
    /*
    identifier 的范围可以是:

    NSCalendarIdentifierGregorian 公历
    NSCalendarIdentifierBuddhist 佛教日历
    NSCalendarIdentifierChinese 中国农历
    NSCalendarIdentifierHebrew 希伯来日历
    NSCalendarIdentifierIslamic 伊斯兰日历
    NSCalendarIdentifierIslamicCivil 伊斯兰教日历
    NSCalendarIdentifierJapanese 日本日历
    NSCalendarIdentifierRepublicOfChina 中华民国日历(台湾)
    NSCalendarIdentifierPersian 波斯历
    NSCalendarIdentifierIndian 印度日历
    NSCalendarIdentifierISO8601 ISO8601
    */
    let cal1: NSCalendar? = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)

    // 返回当前客户端的逻辑日历
    /*
    取得的值会一直保持在 cache 中,第一次用此方法实例化对象后,即使修改了系统日历设定,这个对象也不会改变
    */
    let cal2: NSCalendar = NSCalendar.currentCalendar()

    // 返回当前客户端的逻辑日历
    /*
    当每次修改系统日历设定,其实例化的对象也会随之改变。
    */
    let cal3: NSCalendar = NSCalendar.autoupdatingCurrentCalendar()

2、日历的设置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // 设置区域
    [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];

    // 设置时区
    /*
    设置时区,设置为 GMT+8,即北京时间(+8)
    */
    [calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CCT"]];
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:+28800]];

    // 设定每周的第一天从星期几开始
    /*
    1 代表星期日开始,2 代表星期一开始,以此类推。默认值是 1
    */
    [calendar setFirstWeekday:2];

    // 设置每年及每月第一周必须包含的最少天数
    /*
    设定第一周最少包括 3 天,则 value 传入 3
    */
    [calendar setMinimumDaysInFirstWeek:3];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    let calendar: NSCalendar = NSCalendar.currentCalendar()

    // 设置区域
    calendar.locale = NSLocale(localeIdentifier: "zh_CN")

    // 设置时区
    /*
    设置时区,设置为 GMT+8,即北京时间(+8)
    */
    calendar.timeZone = NSTimeZone(abbreviation: "EST")!
    calendar.timeZone = NSTimeZone(forSecondsFromGMT: +28800)

    // 设定每周的第一天从星期几开始
    /*
    1 代表星期日开始,2 代表星期一开始,以此类推。默认值是 1
    */
    calendar.firstWeekday = 2

    // 设置每年及每月第一周必须包含的最少天数
    /*
    设定第一周最少包括 3 天,则 value 传入 3
    */
    calendar.minimumDaysInFirstWeek = 3

3、日历设置信息的获取

  • Objective-C

    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
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // 获取日历标示符
    /*
    有效的日历标示符包括:

    gregorian
    buddhist
    chinese
    hebrew
    islamic
    islamic-civil
    japanese
    roc
    persian
    indian
    iso8601
    */
    NSString *calendarIdentifier = calendar.calendarIdentifier;

    // 获取地区信息
    /*
    语言地区
    */
    NSString *localeIdentifier = calendar.locale.localeIdentifier;
    NSString *localeIdentifier2 = [calendar.locale objectForKey:NSLocaleIdentifier];

    // 获取时区信息
    NSTimeZone *timeZone = calendar.timeZone;

    // 获取每周的第一天从星期几开始
    /*
    缺省为星期天
    */
    NSUInteger firstWeekday = calendar.firstWeekday;

    // 获取第一周必须包含的最少天数
    /*
    缺省为 1
    */
    NSUInteger minimumDaysInFirstWeek = calendar.minimumDaysInFirstWeek;
  • Swift

    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
    let calendar: NSCalendar = NSCalendar.currentCalendar()

    // 获取日历标示符
    /*
    有效的日历标示符包括:

    gregorian
    buddhist
    chinese
    hebrew
    islamic
    islamic-civil
    japanese
    roc
    persian
    indian
    iso8601
    */
    let calendarIdentifier = calendar.calendarIdentifier

    // 获取地区信息
    let localeIdentifier1 = calendar.locale?.localeIdentifier
    let localeIdentifier2: AnyObject? = calendar.locale?.objectForKey(NSLocaleIdentifier)

    // 获取时区信息
    let timeZone = calendar.timeZone

    // 获取每周的第一天从星期几开始
    let firstWeekday = calendar.firstWeekday

    // 获取第一周必须包含的最少天数
    let minimumDaysInFirstWeek = calendar.minimumDaysInFirstWeek

4、日历信息的获取

  • 1)获取一个小的单位在一个大的单位里面的序数

    • Objective-C

      1
      2
      3
      NSUInteger count = [calendar ordinalityOfUnit:NSCalendarUnitWeekday 
      inUnit:NSCalendarUnitWeekOfMonth
      forDate:[NSDate date]];
      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
      104
      105
      - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

      NSCalendarUnit包含的值有:

      NSCalendarUnitEra -- 纪元单位。对于 NSGregorianCalendar (公历)来说,只有公元前(BC)和公元(AD);
      而对于其它历法可能有很多,例如日本和历是以每一代君王统治来做计算。
      NSCalendarUnitYear -- 年单位。值很大,相当于经历了多少年,未来多少年。
      NSCalendarUnitMonth -- 月单位。范围为1-12
      NSCalendarUnitDay -- 天单位。范围为1-31
      NSCalendarUnitHour -- 小时单位。范围为0-24
      NSCalendarUnitMinute -- 分钟单位。范围为0-60
      NSCalendarUnitSecond -- 秒单位。范围为0-60
      NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear -- 周单位。范围为1-53
      NSCalendarUnitWeekday -- 星期单位,每周的7天。范围为1-7
      NSCalendarUnitWeekdayOrdinal -- 没完全搞清楚
      NSCalendarUnitQuarter -- 几刻钟,也就是15分钟。范围为1-4
      NSCalendarUnitWeekOfMonth -- 月包含的周数。最多为6个周
      NSCalendarUnitWeekOfYear -- 年包含的周数。最多为53个周
      NSCalendarUnitYearForWeekOfYear -- 没完全搞清楚
      NSCalendarUnitTimeZone -- 没完全搞清楚

      <1>、当小单位为 NSCalendarUnitWeekday,大单位为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear
      (即某个日期在这一周是第几天),根据 firstWeekday 属性不同,返回的结果也不同。具体说明如下:

      当 firstWeekday 被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:
      fromDate 传入的参数是星期日,则函数返回 1
      fromDate 传入的参数是星期一,则函数返回 2
      当 firstWeekday 被指定为其它值时(即 <> 1)时,假设firstWeekday 被指定为星期一(即 = 2),那么:
      fromDate 传入的参数是星期一,则函数返回 1
      fromDate 传入的参数是星期二,则函数返回 2
      fromDate 传入的参数是星期日,则函数返回 7

      <2>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitYear
      (即某个日期在这一年中是第几周),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
      ......

      <3>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitMonth
      (即某个日期在这一个月中是第几周),minimumDaysInFirstWeek 属性影响它的返回值。具体说明如下:

      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号。
      a. 如果将 minimumDaysInFirstWeek 设定为小于或等于5的数
      则 fromDate 传入41-5号,方法均返回1
      则 fromDate 传入46-12号,方法均返回2
      则 fromDate 传入413-19号,方法均返回3
      ....

      b. 如果将 minimumDaysInFirstWeek 设定为大于5的数
      则 fromDate 传入1-5号,方法均返回0
      则 fromDate 传入6-12号,方法均返回1
      则 fromDate 传入13-19号,方法均返回2
      ....
    • Swift

      1
      let calendar: NSCalendar = NSCalendar.currentCalendar()
      1
      let count = calendar.ordinalityOfUnit(NSCalendarUnit.Weekday, inUnit: NSCalendarUnit.WeekOfMonth, forDate: NSDate())
      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
      104
      105
      106
      107
      108
      public func ordinalityOfUnit(smaller: NSCalendarUnit, inUnit larger: NSCalendarUnit, forDate date: NSDate) -> Int

      NSCalendarUnit包含的值有:

      Era -- 纪元单位。对于 NSGregorianCalendar (公历)来说,只有公元前(BC)和公元(AD);而对于其它历法可能有很多,
      例如日本和历是以每一代君王统治来做计算。
      Year -- 年单位。值很大,相当于经历了多少年,未来多少年。
      Month -- 月单位。范围为1-12
      Day -- 天单位。范围为1-31
      Hour -- 小时单位。范围为0-24
      Minute -- 分钟单位。范围为0-60
      Second -- 秒单位。范围为0-60
      Weekday -- 星期单位,每周的7天。范围为1-7
      WeekdayOrdinal -- 没完全搞清楚

      Quarter -- 几刻钟,也就是15分钟。范围为1-4
      WeekOfMonth -- 月包含的周数。最多为6个周
      WeekOfYear -- 年包含的周数。最多为53个周
      YearForWeekOfYear -- 没完全搞清楚
      Nanosecond -- 微妙
      Calendar --
      TimeZone -- 没完全搞清楚

      <1>、当小单位为 NSCalendarUnitWeekday,大单位为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear
      (即某个日期在这一周是第几天),根据 firstWeekday 属性不同,返回的结果也不同。具体说明如下:

      当 firstWeekday 被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:
      fromDate 传入的参数是星期日,则函数返回 1
      fromDate 传入的参数是星期一,则函数返回 2
      当 firstWeekday 被指定为其它值时(即 <> 1)时,假设firstWeekday 被指定为星期一(即 = 2),那么:
      fromDate 传入的参数是星期一,则函数返回 1
      fromDate 传入的参数是星期二,则函数返回 2
      fromDate 传入的参数是星期日,则函数返回 7

      <2>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitYear
      (即某个日期在这一年中是第几周),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
      ......

      <3>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitMonth
      (即某个日期在这一个月中是第几周),minimumDaysInFirstWeek 属性影响它的返回值。具体说明如下:

      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号。
      a. 如果将 minimumDaysInFirstWeek 设定为小于或等于5的数
      则 fromDate 传入41-5号,方法均返回1
      则 fromDate 传入46-12号,方法均返回2
      则 fromDate 传入413-19号,方法均返回3
      ....

      b. 如果将 minimumDaysInFirstWeek 设定为大于5的数
      则 fromDate 传入1-5号,方法均返回0
      则 fromDate 传入6-12号,方法均返回1
      则 fromDate 传入13-19号,方法均返回2
      ....
  • 2)获取一个小的单位在一个大的单位里面的取值范围

    • Objective-C

      1
      2
      NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:[NSDate date]];
      NSLog(@"%zi -- %zi", range.location, range.length);
      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
      - (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

      调用这个方法要明确一点,取得的是"范围"而不是"包含",下面是一些例子:

      <1>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitYear,并不是要取这一年包含多少天,而是要取"天"(Day)这个单位
      在这一年(Year)的取值范围。其实不管你提供的日期是多少,返回的值都是"1--31"

      <2>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitMonth。要取得参数时间点所对应的月份下,"天"(Day)的取值范围。
      根据参数时间的月份不同,值也不同。例如2月是1--283月是 1--314月是1--30

      <3>、小单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位是 NSCalendarUnitMonth。要取得参数
      时间点所对应的月份下,"周"(Week)的取值范围。需要注意的是结果会受到 minimumDaysInFirstWeek 属性的影响。在默认
      minimumDaysInFirstWeek 情况下,取得的范围值一般是"1--5",从日历上可以看出来这个月包含5排,即5个周。

      <4>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear。要取得周所包含
      "天"(Day)的取值范围。下面是一个示例日历图:

      20134
      日 一 二 三 四 五 六
      ---------------------------------
      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

      在上图的日期条件下,假如提供的参数是41日--46日,那么对应的 week 就是1(第一个周),可以看到第一个周包含有6天,
      1号开始,那么最终得到的范围值为1--6

      假如提供的参数是418日,那么对应的 week 是3(第三个周),第三个周包含有7天,从14号开始,那么最终得到的范围值是14--7

      假如提供的参数是430日,那么对应的 week 是5(第五个周),第五个周只包含3天,从28号开始,那么最终得到的范围值是28--3
    • Swift

      1
      let calendar: NSCalendar = NSCalendar.currentCalendar()
      1
      let range = calendar.rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: NSDate())
      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
      public func rangeOfUnit(smaller: NSCalendarUnit, inUnit larger: NSCalendarUnit, forDate date: NSDate) -> NSRange

      调用这个方法要明确一点,取得的是"范围"而不是"包含",下面是一些例子:

      <1>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitYear,并不是要取这一年包含多少天,而是要取"天"(Day)这个单位
      在这一年(Year)的取值范围。其实不管你提供的日期是多少,返回的值都是"1--31"

      <2>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitMonth。要取得参数时间点所对应的月份下,"天"(Day)的取值范围。
      根据参数时间的月份不同,值也不同。例如2月是1--283月是1--314月是1--30

      <3>、小单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位是 NSCalendarUnitMonth。要取得参数时间点
      所对应的月份下,"周"(Week)的取值范围。需要注意的是结果会受到 minimumDaysInFirstWeek 属性的影响。在默认
      minimumDaysInFirstWeek 情况下,取得的范围值一般是"1--5",从日历上可以看出来这个月包含5排,即5个周。

      <4>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear。要取得周所包含
      "天"(Day)的取值范围。下面是一个示例日历图:

      20134
      日 一 二 三 四 五 六
      ---------------------------------
      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

      在上图的日期条件下,假如提供的参数是41日--46日,那么对应的 week 就是1(第一个周),可以看到第一个周包含有6天,
      1号开始,那么最终得到的范围值为1--6

      假如提供的参数是418日,那么对应的 week 是3(第三个周),第三个周包含有7天,从14号开始,那么最终得到的范围值是14--7

      假如提供的参数是430日,那么对应的 week 是5(第五个周),第五个周只包含3天,从28号开始,那么最终得到的范围值是28--3
  • 3)获取所在日历单位的开始时间及所在日历单位的总秒数

    • Objective-C

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      NSDate *startDate = nil;
      NSTimeInterval intervalCount = 0;

      BOOL bl = [calendar rangeOfUnit:NSCalendarUnitMonth
      startDate:&startDate
      interval:&intervalCount
      forDate:[NSDate date]];

      if (bl) {

      // 得到本地时间,避免时区问题
      startDate = [startDate dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:startDate]];

      NSLog(@"%@",startDate);
      NSLog(@"%f",intervalCount);
      }
      else {
      NSLog(@"无法计算");
      }
    • Swift

      1
      let calendar: NSCalendar = NSCalendar.currentCalendar()
      1
      2
      3
      4
      5
      6
      7
      var startDate: NSDate? = nil
      var intervalCount: NSTimeInterval = 0

      let bl: Bool = calendar.rangeOfUnit( NSCalendarUnit.Month,
      startDate: &startDate,
      interval: &intervalCount,
      forDate: NSDate())
文章目录
  1. 1. 前言
  2. 2. 1、日历的创建
  3. 3. 2、日历的设置
  4. 4. 3、日历设置信息的获取
  5. 5. 4、日历信息的获取
隐藏目录