Swift-日历相关02

一,日历中ordinality()方法使用:

  • 1,计算本月第n周,本月第n天,本周第n天
  • 2,计算本年的第n周,本年的第n天
  • 3,计算本月的天数取值范围,本年的月数取值范围是,本年中天的取值范围,本年中周的取值范围,本月中周的取值范围等
fileprivate func getInfoOfCalendar(){

    let calendar = Calendar.current

    let dateStr = "2017年04月15日 00时00分00秒 +0800"//我这里其实日期定的还是同时代
    let dateFormatter = DateFormatter.init()
    dateFormatter.dateFormat = "yyyy年MM月dd日 HH时mm分ss秒 Z"
    let date = dateFormatter.date(from: dateStr)

    //计算本月第n周
    let weekOfMonth = calendar.ordinality(of: .weekOfMonth, in: .month, for: date!)
    print("本月第\(weekOfMonth!)周")
    //计算本月第n天
    let dayOfMonth = calendar.ordinality(of: .day, in: .month, for: date!)
    print("本月第\(dayOfMonth!)天")
    //计算本周第n天
    let day = calendar.ordinality(of: .day, in: .weekOfMonth, for: date!)
    print("本周第\(day!)天")

    //计算本年的第n周
    let weekOfYear = calendar.ordinality(of: .weekOfYear, in: .year, for: date!)
    print("本年第\(weekOfYear!)周")
    //计算本年的第n天
    let dayOfYear = calendar.ordinality(of: .day, in: .year, for: date!)
    print("本年第\(dayOfYear!)天")

    //计算本月的天数取值范围
    let rangeOfDayInMonth = calendar.range(of: .day, in: .month, for: date!)
    print("本月的天数取值范围是\(rangeOfDayInMonth!)")
    //计算本年的月数取值范围是
    let rangeOfMonthInYear = calendar.range(of: .month, in: .year, for: date!)
    print("本年的月数取值范围是\(rangeOfMonthInYear!)")
    //计算本年中天的取值范围:只能是0-31中的一个值
    let rangeOfDayInYear = calendar.range(of: .day, in: .year, for: date!)
    print("本年的天数取值范围是\(rangeOfDayInYear!)")
    //计算本年中周的取值范围
    let rangeOfWeekInYear = calendar.range(of: .weekOfYear, in: .year, for: date!)
    print("本年的周数取值范围是\(rangeOfWeekInYear!)")
    //计算本月中周的取值范围
    let rangeOfWeekIMonth = calendar.range(of: .weekOfMonth, in: .month, for: date!)
    print("本月的周数取值范围是\(rangeOfWeekIMonth!)")
}

二,方法使用详解:

以下内容参考原文 原文链接

let calendar:NSCalendar = NSCalendar.currentCalendar()

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

    let count = calendar.ordinalityOfUnit(NSCalendarUnit.Weekday, inUnit: NSCalendarUnit.WeekOfMonth, forDate: NSDate())

    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 属性影响它的返回值。具体说明如下:

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

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

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

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

2)获取一个小的单位在一个大的单位里面的取值范围

    let range = calendar.rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: NSDate())

    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--28、3月是1--31、4月是1--30。

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

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

            2013年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

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

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

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


推荐阅读更多精彩内容