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。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 说出来让人笑话,我看着奥运会上国旗冉冉升起,运动健儿奋勇拼搏,那一时刻对着电视机屏幕会热泪盈眶。很多人是看比...
    迷糊猫的清醒阅读 136评论 0 0
  • 说说我的母亲 静子 说起来有点让人费解,我以我的母亲为学习的标杆。 母亲出生于上世纪三十年代。一个七老八十的人,以...
    我是你们的静子阅读 801评论 1 2
  • 一个傍晚,清清的风,暖暖的人。
    不诉衷肠阅读 183评论 2 1