【iOS開原始碼】(3):DateTools

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.