前言

  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、日历的创建

  1. // 根据提供的日历标示符初始化。
  2. /*
  3. identifier 的范围可以是:
  4. NSCalendarIdentifierGregorian 公历
  5. NSCalendarIdentifierBuddhist 佛教日历
  6. NSCalendarIdentifierChinese 中国农历
  7. NSCalendarIdentifierHebrew 希伯来日历
  8. NSCalendarIdentifierIslamic 伊斯兰日历
  9. NSCalendarIdentifierIslamicCivil 伊斯兰教日历
  10. NSCalendarIdentifierJapanese 日本日历
  11. NSCalendarIdentifierRepublicOfChina 中华民国日历(台湾)
  12. NSCalendarIdentifierPersian 波斯历
  13. NSCalendarIdentifierIndian 印度日历
  14. NSCalendarIdentifierISO8601 ISO8601
  15. */
  16. let cal1:NSCalendar? = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
  17. // 返回当前客户端的逻辑日历
  18. /*
  19. 取得的值会一直保持在 cache 中,第一次用此方法实例化对象后,即使修改了系统日历设定,这个对象也不会改变
  20. */
  21. let cal2:NSCalendar = NSCalendar.currentCalendar()
  22. // 返回当前客户端的逻辑日历
  23. /*
  24. 当每次修改系统日历设定,其实例化的对象也会随之改变。
  25. */
  26. let cal3:NSCalendar = NSCalendar.autoupdatingCurrentCalendar()

2、日历的设置

  1. let calendar:NSCalendar = NSCalendar.currentCalendar()
  2. // 设置区域
  3. calendar.locale = NSLocale(localeIdentifier: "zh_CN")
  4. // 设置时区
  5. /*
  6. 设置时区,设置为 GMT+8,即北京时间(+8)
  7. */
  8. calendar.timeZone = NSTimeZone(abbreviation: "EST")!
  9. calendar.timeZone = NSTimeZone(forSecondsFromGMT: +28800)
  10. // 设定每周的第一天从星期几开始
  11. /*
  12. 1 代表星期日开始,2 代表星期一开始,以此类推。默认值是 1
  13. */
  14. calendar.firstWeekday = 2
  15. // 设置每年及每月第一周必须包含的最少天数
  16. /*
  17. 设定第一周最少包括 3 天,则 value 传入 3
  18. */
  19. calendar.minimumDaysInFirstWeek = 3

3、日历设置信息的获取

  1. let calendar:NSCalendar = NSCalendar.currentCalendar()
  2. // 获取日历标示符
  3. /*
  4. 有效的日历标示符包括:
  5. gregorian
  6. buddhist
  7. chinese
  8. hebrew
  9. islamic
  10. islamic-civil
  11. japanese
  12. roc
  13. persian
  14. indian
  15. iso8601
  16. */
  17. let calendarIdentifier = calendar.calendarIdentifier
  18. // 获取地区信息
  19. let localeIdentifier1 = calendar.locale?.localeIdentifier
  20. let localeIdentifier2: AnyObject? = calendar.locale?.objectForKey(NSLocaleIdentifier)
  21. // 获取时区信息
  22. let timeZone = calendar.timeZone
  23. // 获取每周的第一天从星期几开始
  24. let firstWeekday = calendar.firstWeekday
  25. // 获取第一周必须包含的最少天数
  26. let minimumDaysInFirstWeek = calendar.minimumDaysInFirstWeek

4、日历信息的获取

  1. let calendar:NSCalendar = NSCalendar.currentCalendar()
  • 1)获取一个小的单位在一个大的单位里面的序数

    1. let count = calendar.ordinalityOfUnit(NSCalendarUnit.Weekday, inUnit: NSCalendarUnit.WeekOfMonth, forDate: NSDate())
    1. public func ordinalityOfUnit(smaller: NSCalendarUnit, inUnit larger: NSCalendarUnit, forDate date: NSDate) -> Int
    2. NSCalendarUnit包含的值有:
    3. Era -- 纪元单位。对于 NSGregorianCalendar (公历)来说,只有公元前(BC)和公元(AD);而对于其它历法可能有很多,
    4. 例如日本和历是以每一代君王统治来做计算。
    5. Year -- 年单位。值很大,相当于经历了多少年,未来多少年。
    6. Month -- 月单位。范围为1-12
    7. Day -- 天单位。范围为1-31
    8. Hour -- 小时单位。范围为0-24
    9. Minute -- 分钟单位。范围为0-60
    10. Second -- 秒单位。范围为0-60
    11. Weekday -- 星期单位,每周的7天。范围为1-7
    12. WeekdayOrdinal -- 没完全搞清楚
    13. Quarter -- 几刻钟,也就是15分钟。范围为1-4
    14. WeekOfMonth -- 月包含的周数。最多为6个周
    15. WeekOfYear -- 年包含的周数。最多为53个周
    16. YearForWeekOfYear -- 没完全搞清楚
    17. Nanosecond -- 微妙
    18. Calendar --
    19. TimeZone -- 没完全搞清楚
    20. <1>、当小单位为 NSCalendarUnitWeekday,大单位为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear
    21. (即某个日期在这一周是第几天),根据 firstWeekday 属性不同,返回的结果也不同。具体说明如下:
    22. firstWeekday 被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:
    23. fromDate 传入的参数是星期日,则函数返回 1
    24. fromDate 传入的参数是星期一,则函数返回 2
    25. firstWeekday 被指定为其它值时(即 <> 1)时,假设firstWeekday 被指定为星期一(即 = 2),那么:
    26. fromDate 传入的参数是星期一,则函数返回 1
    27. fromDate 传入的参数是星期二,则函数返回 2
    28. fromDate 传入的参数是星期日,则函数返回 7
    29. <2>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitYear
    30. (即某个日期在这一年中是第几周),minimumDaysInFirstWeek 属性影响它的返回值。具体说明如下:
    31. 20051

    32. --------------------------------
    33. 1
    34. 2 3 4 5 6 7 8
    35. 9 10 11 12 13 14 15
    36. 16 17 18 19 20 21 22
    37. 23 24 25 26 27 28 29
    38. 30 31
    39. 20051月第一周包括1号。
    40. a. 如果将 minimumDaysInFirstWeek 设定 = 1
    41. fromDate 传入11号,方法均返回1 ==> 满足 minimumDaysInFirstWeek 指定的天数(最少1天),所以方法将其归为
    42. 2005年的第1
    43. fromDate 传入12-8号,方法均返回2
    44. fromDate 传入19-15号,方法均返回3
    45. ......
    46. b. 如果将 minimumDaysInFirstWeek 设定为 > 1,比如2
    47. fromDate 传入11号,方法均返回53 ==> 不足2天,所以方法将其归为2004年的第53
    48. fromDate 传入12-8号,方法均返回1
    49. fromDate 传入19-15号,方法均返回2
    50. ......
    51. 20081

    52. ---------------------------------
    53. 1 2 3 4 5
    54. 6 7 8 9 10 11 12
    55. 13 14 15 16 17 18 19
    56. 20 21 22 23 24 25 26
    57. 27 28 29 30 31
    58. 20051月第一周包括1-5号共5天。
    59. a. 如果将 minimumDaysInFirstWeek 设定为 <= 5
    60. fromDate 传入11-5号,方法均返回1 ==> 满足 minimumDaysInFirstWeek 指定的天数,所以方法将其归为
    61. 2008年的第1
    62. fromDate 传入16-12号,方法均返回2
    63. fromDate 传入113-19号,方法均返回3
    64. ......
    65. b. 如果将 minimumDaysInFirstWeek 设定为 > 5,比如6
    66. fromDate 传入11-5号,方法均返回53 ==> 当周不足6天,所以方法将其归为2007年的第53
    67. fromDate 传入12-8号,方法均返回1
    68. fromDate 传入19-15号,方法均返回2
    69. ......
    70. <3>、当小单位为 参数为 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位为 NSCalendarUnitMonth
    71. (即某个日期在这一个月中是第几周),minimumDaysInFirstWeek 属性影响它的返回值。具体说明如下:
    72. 20084

    73. ---------------------------------
    74. 1 2 3 4 5
    75. 6 7 8 9 10 11 12
    76. 13 14 15 16 17 18 19
    77. 20 21 22 23 24 25 26
    78. 27 28 29 30
    79. 20084月第一周包括12345号。
    80. a. 如果将 minimumDaysInFirstWeek 设定为小于或等于5的数
    81. fromDate 传入41-5号,方法均返回1
    82. fromDate 传入46-12号,方法均返回2
    83. fromDate 传入413-19号,方法均返回3
    84. ....
    85. b. 如果将 minimumDaysInFirstWeek 设定为大于5的数
    86. fromDate 传入1-5号,方法均返回0
    87. fromDate 传入6-12号,方法均返回1
    88. fromDate 传入13-19号,方法均返回2
    89. ....
  • 2)获取一个小的单位在一个大的单位里面的取值范围

    1. let range = calendar.rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: NSDate())
    1. public func rangeOfUnit(smaller: NSCalendarUnit, inUnit larger: NSCalendarUnit, forDate date: NSDate) -> NSRange
    2. 调用这个方法要明确一点,取得的是"范围"而不是"包含",下面是一些例子:
    3. <1>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitYear,并不是要取这一年包含多少天,而是要取"天"(Day)这个单位
    4. 在这一年(Year)的取值范围。其实不管你提供的日期是多少,返回的值都是"1--31"
    5. <2>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitMonth。要取得参数时间点所对应的月份下,"天"(Day)的取值范围。
    6. 根据参数时间的月份不同,值也不同。例如2月是1--283月是1--314月是1--30
    7. <3>、小单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear,大单位是 NSCalendarUnitMonth。要取得参数时间点
    8. 所对应的月份下,"周"(Week)的取值范围。需要注意的是结果会受到 minimumDaysInFirstWeek 属性的影响。在默认
    9. minimumDaysInFirstWeek 情况下,取得的范围值一般是"1--5",从日历上可以看出来这个月包含5排,即5个周。
    10. <4>、小单位是 NSCalendarUnitDay,大单位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear。要取得周所包含
    11. "天"(Day)的取值范围。下面是一个示例日历图:
    12. 20134

    13. ---------------------------------
    14. 1 2 3 4 5 6
    15. 7 8 9 10 11 12 13
    16. 14 15 16 17 18 19 20
    17. 21 22 23 24 25 26 27
    18. 28 29 30
    19. 在上图的日期条件下,假如提供的参数是41日--46日,那么对应的 week 就是1(第一个周),可以看到第一个周包含有6天,
    20. 1号开始,那么最终得到的范围值为1--6
    21. 假如提供的参数是418日,那么对应的 week 3(第三个周),第三个周包含有7天,从14号开始,那么最终得到的范围值是14--7
    22. 假如提供的参数是430日,那么对应的 week 5(第五个周),第五个周只包含3天,从28号开始,那么最终得到的范围值是28--3
  • 3)获取所在日历单位的开始时间及秒数

    1. var startDate:NSDate? = nil
    2. var intervalCount:NSTimeInterval = 0
    3. let bl:Bool = calendar.rangeOfUnit(NSCalendarUnit.Month,
    4. startDate: &startDate,
    5. interval: &intervalCount,
    6. forDate: NSDate())

iOS - Swift NSCalendar 日历的更多相关文章

  1. iOS - OC NSCalendar 日历

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

  2. iOs 自定义UIView 日历的实现 Swift2.1

    学习Swift有一个月了,动手写一个UIView吧. 所有源代码在最后,直接用就可以了,第一次写Swift,和C#,Java还是有区别的 (博客园可以考虑在代码插入中添加Swift的着色了) 1  函 ...

  3. NSCalendar日历

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

  4. 设置代码ios 6添加日历事件No calendar has been set.错误

    查了好多资料,发明还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 在iOS 6做日历事件添加时,来来回回报错,No calendar has been set ...

  5. NSCalendar 日历类

    NSCalendar 日历类 Cocoa中对日期和时间的处理 NSCalendar (一) (2008-11-12 21:54:10) NSCalendar用于处理时间相关问题.比如比较时间前后.计算 ...

  6. iOS swift的xcworkspace多项目管理(架构思想)

    iOS  swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...

  7. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  8. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  9. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

随机推荐

  1. HDU 5768:Lucky7(中国剩余定理 + 容斥原理)

    http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Problem Description   When ?? was born, seven ...

  2. 模拟http响应头

    1.打开需要模拟的页面请求头 2.编码要发送的数据 3.通过fsockopen函数发送请求头 代码如下 //方法二 $URL="http://device.test.com/admin/ma ...

  3. java从命令行接收多个数字,求和之后输出结果

    设计思想:获取输入数的个数,然后将要相加的数字转换成为浮点型进行相加,最后进行输出 源代码: package Add; import java.util.Scanner; // 严羽卿   2015. ...

  4. load-on-startup

    在servlet的配置当中,<load-on-startup>1</load-on-startup>,一般出现在启动线程的servlet当中 含义是: 标记容器是否在启动的时候 ...

  5. js格式化日期 年月日

    /**                     * 格式化日期                     * @param value                     * @param row  ...

  6. Squares 分类: POJ 2015-08-04 11:46 3人阅读 评论(0) 收藏

    Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 17462 Accepted: 6634 Description ...

  7. shell脚本常见错误

    一.引言 想要学习使用shell脚本,却在开始的时候遇到很多不顺利,都是一些小细节的东西,所以在此记录一下. 二.各种细节问题 1.变量作为赋值对象时不需要添加$,取值时需要,也就是说,这个$就是取值 ...

  8. Javascript正则表达式笔记

    一.字符类 将单独的直接字符放进[]内,就组成了字符类.一个字符类和它所包含的任何字符都匹配. 例如:/[abc]/ 与abc三个字母的任意一个匹配. 同时,还可以定义否定字符类.利用^字符.例如:/ ...

  9. jquery easyui datagrid使用参考

    jquery easyui datagrid使用参考   创建datagrid 在页面上添加一个div或table标签,然后用jquery获取这个标签,并初始化一个datagrid.代码如下: 页面上 ...

  10. 2016年6月26日 星期日 --出埃及记 Exodus 14:23

    2016年6月26日 星期日 --出埃及记 Exodus 14:23 The Egyptians pursued them, and all Pharaoh's horses and chariots ...