標籤:style io ar os 使用 sp for 檔案 on
一、介紹
DateTools 是一個用於處理日期和時間的 O-C 庫。它包含 3 個子庫:
NSDate+DateTools、Time Periods、Time Periods Group。
1、NSDate+DateTools
不知道你們是否有這種感覺,O-C 提供的 NSDate 似乎和其他語言的日期類不太一樣,它更像是由 timeIntervalSince... 方法構造的 Unix 時間,另外在加上一個日曆功能。但有時候我們更希望以日期組件“年、月、日”的方式來訪問日期。這就是 NSDate+DateTools 要為我們提供的。它主要提供了一下幾個功能。
1) Time ago
這部分實際上是Kevin Lawler 寫的 NSDate+TimeAgo 庫,現在已被正式納入到 DateTools 庫中。
顧名思義,Time ago 就是將日期轉變為相對日期的形式,即我們常用的“昨天、今天、明天、幾天前,一周以後……”這樣的表述方式。它有“長、短”兩種格式,後者是前者的更簡短的描述。例如:
NSDate *timeAgoDate = [NSDatedateWithTimeIntervalSinceNow:-4];
NSLog(@"Time Ago: %@",timeAgoDate.timeAgoSinceNow);
NSLog(@"Time Ago: %@",timeAgoDate.shortTimeAgoSinceNow);
以上代碼分別輸出:
Time Ago: 4 seconds ago
Time Ago: 4s
當然,DateTools 提供了多達33種語言的支援,當然也包括簡體/繁體中文。
2) 訪問日期組件
以前,我們要讀取一個 NSDate 的年月日,必須這樣做:
//Create calendar
NSCalendar *calendar =[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
unitFlags = NSYearCalendarUnit |NSMonthCalendarUnit;
NSDateComponents *dateComponents= [calendar components:unitFlags fromDate:date];
//Get components
NSInteger year =dateComponents.year;
NSInteger month =dateComponents.month;
但是,使用 DateTools,只需要:
NSInteger year = date.year;
NSInteger month = date.month;
如果採用了非格魯吉亞日曆,只需這樣:
NSInteger day = [datedayWithCalendar:calendar];
還可以將整個 DateTools 預設的日曆由格魯吉亞日曆修改為其它,則可以修改 NSDate+DateTools.m檔案中的 defaultCalendar 方法。
3) 日期的運算
以前,要想將既有日期上加/減一年形成新的日期,我們必須:
//Create calendar
NSCalendar *calendar =[[NSCalendar alloc] initWithCalendarIdentifier:[NSDate defaultCalendar]];
NSDateComponents *components =[[NSDateComponents alloc] init];
//Make changes
[components setYear:1];
//Get new date with updated year
NSDate *newDate = [calendardateByAddingComponents:components toDate:date options:0];
使用 DateTools 則可以用:
NSDate *newDate = [datedateByAddingYears:1];
如果是減去一年,則可以用dateBySubtractingYears 方法。
4) 比較運算
NSDate 有 4 種基本的比較運算:
isEqualToDate:
earlierDate:
laterDate:
compare:
DateTools 則將它們改成了:
isEarlierThan
isEarlierThanOrEqualTo
isLaterThan
isLaterThanOrEqualTo
除此之外,DateTools 還提供了更多的操作:
· yearsFrom:, yearsUntil, yearsAgo, yearsEarlierThan:,yearsLaterThan:
· monthsFrom:, monthsUntil, monthsAgo,monthsEarlierThan:, monthsLaterThan:
· weeksFrom:, weeksUntil, weeksAgo, weeksEarlierThan:,weeksLaterThan:
· daysFrom:, daysUntil, daysAgo, daysEarlierThan:,daysLaterThan:
· hoursFrom:, hoursUntil, hoursAgo, hoursEarlierThan:,hoursLaterThan:
· minutesFrom:, minutesUntil, minutesAgo,minutesEarlierThan:, minutesLaterThan:
· secondsFrom:, secondsUntil, secondsAgo,secondsEarlierThan:, secondsLaterThan:
這樣,你可以很輕易地知道兩個日期相差有多少年/月/日:
NSInteger yearsApart =[firstDate yearsFrom:secondDate];
5) 格式化日期字串
DateTools 簡化了格式化日期字串的操作,即formattedDateWithStyle:和formattedDateWithFormat: 方法。
2、時段
時段即時間段,包括一段連續的時間,DateTools 使用 DTTimePeriod 來表示。 DTTimePeriod 類包括一系列初始化方法、以及關於時段的運算和比較操作。
1) 建立
時段的建立(初始化方法)有兩種。
時段包括一個起始時間和一個結束時間。這也體現在它的初始化方法中:
DTTimePeriod *timePeriod =[[DTTimePeriod alloc] initWithStartDate:startDate endDate:endDate];
當然,你也可以不指定結束時間,結束時間可以由開始時間和時段的長度得到。例如下面的時段由開始時間和長度為5個小時的時間長度來描述:
DTTimePeriod *timePeriod =[DTTimePeriod timePeriodWithSize:DTTimePeriodSizeHour amount:5startingAt:[NSDate date]];
2) 時段的屬性
· hasStartDate - 如果該時段擁有開始時間,返回 Yes
· hasEndDate - 如果該時段擁有結束時間,返回 Yes
· isMoment - 如果時段的開始時間等於結束時間,返回 Yes
· durationIn.... - 以指定的單位返回時間長度。
3) 運算
時段支援3種運算:移動、增加時間長度、減少時間長度。
移動是將時段開始時間提前或後延的操作。使用方法shiftEarlierWithSize:amount:和shiftLaterWithSize:amount: 進行。
增加時間長度或減少時間長度可以分為兩種情況。一種是固定開始時間,然後增加/減少時間長度,最終會改變結束時間;一種是固定結束時間,然後增加/減少時間長度,最終會改變開始時間。例如:
DTTimePeriod *timePeriod = [DTTimePeriodtimePeriodWithSize:DTTimePeriodSizeMinute endingAt:[NSDate date]];
[timePeriodlengthenWithAnchorDate:DTTimePeriodAnchorEnd size:DTTimePeriodSizeMinuteamount:1];
上述代碼將時間長度由1分鐘增加為2分鐘,固定結束時間,因此開始時間被提前了1分鐘。
4) 關係運算
對於兩個時段,我們經常會這樣考慮二者的關係:它們是否是相同的?是否一個在另一個的範圍之內?
DTTimePeriod 支援5種基本的關係運算:
isEqualToPeriod: 相等
isInside: 被包含
contains: 包含
overlapsWith:重疊,部分相同
intersects:相交,在重疊的基礎上再增加兩種情況:前者結束時間=後者開始時間,前者開始時間=後者結束時間。
3、時段組
即時段集合,包括兩個類:DTTimePeriodCollection和DTTimePeriodChain。二者的最大不同,是後者不允許集合中時段有重疊。
【iOS開原始碼】(3):DateTools