一,日歷中ordinality()方法使用:
- 1链峭,計算本月第n周畦娄,本月第n天,本周第n天
- 2,計算本年的第n周熙卡,本年的第n天
- 3杖刷,計算本月的天數(shù)取值范圍,本年的月數(shù)取值范圍是驳癌,本年中天的取值范圍滑燃,本年中周的取值范圍,本月中周的取值范圍等
fileprivate func getInfoOfCalendar(){
let calendar = Calendar.current
let dateStr = "2017年04月15日 00時00分00秒 +0800"http://我這里其實日期定的還是同時代
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!)天")
//計算本月的天數(shù)取值范圍
let rangeOfDayInMonth = calendar.range(of: .day, in: .month, for: date!)
print("本月的天數(shù)取值范圍是\(rangeOfDayInMonth!)")
//計算本年的月數(shù)取值范圍是
let rangeOfMonthInYear = calendar.range(of: .month, in: .year, for: date!)
print("本年的月數(shù)取值范圍是\(rangeOfMonthInYear!)")
//計算本年中天的取值范圍:只能是0-31中的一個值
let rangeOfDayInYear = calendar.range(of: .day, in: .year, for: date!)
print("本年的天數(shù)取值范圍是\(rangeOfDayInYear!)")
//計算本年中周的取值范圍
let rangeOfWeekInYear = calendar.range(of: .weekOfYear, in: .year, for: date!)
print("本年的周數(shù)取值范圍是\(rangeOfWeekInYear!)")
//計算本月中周的取值范圍
let rangeOfWeekIMonth = calendar.range(of: .weekOfMonth, in: .month, for: date!)
print("本月的周數(shù)取值范圍是\(rangeOfWeekIMonth!)")
}
二颓鲜,方法使用詳解:
以下內(nèi)容參考原文 原文鏈接
let calendar:NSCalendar = NSCalendar.currentCalendar()
1)獲取一個小的單位在一個大的單位里面的序數(shù)
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)甜滨;而對于其它歷法可能有很多乐严,
例如日本和歷是以每一代君王統(tǒng)治來做計算。
Year -- 年單位衣摩。值很大昂验,相當于經(jīng)歷了多少年,未來多少年昭娩。
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 -- 月包含的周數(shù)滞磺。最多為6個周
WeekOfYear -- 年包含的周數(shù)。最多為53個周
YearForWeekOfYear -- 沒完全搞清楚
Nanosecond -- 微妙
Calendar --
TimeZone -- 沒完全搞清楚
<1>莱褒、當小單位為 NSCalendarUnitWeekday击困,大單位為 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear 時
(即某個日期在這一周是第幾天),根據(jù) firstWeekday 屬性不同广凸,返回的結(jié)果也不同阅茶。具體說明如下:
當 firstWeekday 被指定為星期天(即 = 1)時,它返回的值與星期幾對應(yīng)的數(shù)值保持一致谅海。比如:
fromDate 傳入的參數(shù)是星期日脸哀,則函數(shù)返回 1
fromDate 傳入的參數(shù)是星期一,則函數(shù)返回 2
當 firstWeekday 被指定為其它值時(即 <> 1)時扭吁,假設(shè)firstWeekday 被指定為星期一(即 = 2)撞蜂,那么:
fromDate 傳入的參數(shù)是星期一盲镶,則函數(shù)返回 1
fromDate 傳入的參數(shù)是星期二,則函數(shù)返回 2
fromDate 傳入的參數(shù)是星期日蝌诡,則函數(shù)返回 7
<2>溉贿、當小單位為 參數(shù)為 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 設(shè)定 = 1
則 fromDate 傳入1月1號闽寡,方法均返回1 ==> 滿足 minimumDaysInFirstWeek 指定的天數(shù)(最少1天),所以方法將其歸為
2005年的第1周
則 fromDate 傳入1月2-8號尼酿,方法均返回2
則 fromDate 傳入1月9-15號爷狈,方法均返回3
......
b. 如果將 minimumDaysInFirstWeek 設(shè)定為 > 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 設(shè)定為 <= 5時
則 fromDate 傳入1月1-5號,方法均返回1 ==> 滿足 minimumDaysInFirstWeek 指定的天數(shù)惶我,所以方法將其歸為
2008年的第1周
則 fromDate 傳入1月6-12號妈倔,方法均返回2
則 fromDate 傳入1月13-19號,方法均返回3
......
b. 如果將 minimumDaysInFirstWeek 設(shè)定為 > 5绸贡,比如6
則 fromDate 傳入1月1-5號盯蝴,方法均返回53 ==> 當周不足6天,所以方法將其歸為2007年的第53周
則 fromDate 傳入1月2-8號听怕,方法均返回1
則 fromDate 傳入1月9-15號捧挺,方法均返回2
......
<3>、當小單位為 參數(shù)為 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 設(shè)定為小于或等于5的數(shù)
則 fromDate 傳入4月1-5號,方法均返回1
則 fromDate 傳入4月6-12號充石,方法均返回2
則 fromDate 傳入4月13-19號莫换,方法均返回3
....
b. 如果將 minimumDaysInFirstWeek 設(shè)定為大于5的數(shù)
則 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
調(diào)用這個方法要明確一點坷剧,取得的是"范圍"而不是"包含",下面是一些例子:
<1>喊暖、小單位是 NSCalendarUnitDay惫企,大單位是 NSCalendarUnitYear,并不是要取這一年包含多少天陵叽,而是要取"天"(Day)這個單位
在這一年(Year)的取值范圍狞尔。其實不管你提供的日期是多少,返回的值都是"1--31"巩掺。
<2>偏序、小單位是 NSCalendarUnitDay,大單位是 NSCalendarUnitMonth胖替。要取得參數(shù)時間點所對應(yīng)的月份下研儒,"天"(Day)的取值范圍。
根據(jù)參數(shù)時間的月份不同独令,值也不同端朵。例如2月是1--28、3月是1--31燃箭、4月是1--30冲呢。
<3>、小單位是 NSCalendarUnitWeekOfMonth / NSCalendarUnitWeekOfYear遍膜,大單位是 NSCalendarUnitMonth碗硬。要取得參數(shù)時間點
所對應(yīng)的月份下,"周"(Week)的取值范圍瓢颅。需要注意的是結(jié)果會受到 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
在上圖的日期條件下进鸠,假如提供的參數(shù)是4月1日--4月6日,那么對應(yīng)的 week 就是1(第一個周)形病,可以看到第一個周包含有6天客年,
從1號開始霞幅,那么最終得到的范圍值為1--6。
假如提供的參數(shù)是4月18日量瓜,那么對應(yīng)的 week 是3(第三個周)司恳,第三個周包含有7天,從14號開始绍傲,那么最終得到的范圍值是14--7扔傅。
假如提供的參數(shù)是4月30日,那么對應(yīng)的 week 是5(第五個周)烫饼,第五個周只包含3天猎塞,從28號開始,那么最終得到的范圍值是28--3杠纵。