判斷兩個時間是否是同一天大咱,是無法用時間戳對比的恬涧,兩個時間戳間隔在24小時之內(nèi)不能代表是同一天。
用時間戳對比碴巾,也是要計算是否同一年溯捆,同一月,同一日餐抢,才能判斷出是否同一天现使。
所以通常對比兩個時間是用 NSDate 來對比,但是要注意:NSDate 的時間實際上有某個時區(qū)的時間的含義旷痕,通過 [NSDate date] 創(chuàng)建出來的時間默認(rèn)是零時區(qū)時間碳锈,但是這并不意味著兩個 NSDate 比較(判斷是否同一天)就一定會有正確的結(jié)果。
NSDate 比較是否是同一天欺抗,本質(zhì)是比較 NSDateComponents 的 day month year 是否都相等售碳。
比如:
- (BOOL)isSameDayWithDate:(NSDate *)date
{
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlag = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *comp1 = [calendar components:unitFlag fromDate:self];
NSDateComponents *comp2 = [calendar components:unitFlag fromDate:date];
return (([comp1 day] == [comp2 day]) && ([comp1 month] == [comp2 month]) && ([comp1 year] == [comp2 year]));
}
網(wǎng)絡(luò)上很多文章都介紹對 NSDate 或者 NSCalendar 做了擴展,來判斷某個日期是否是今天绞呈、昨天贸人、明天。實際上 NSCalendar 在 ios(8.0) 開始提供了幾個官方方法佃声。
- (BOOL)isDateInToday:(NSDate *)date;
- (BOOL)isDateInYesterday:(NSDate *)date;
- (BOOL)isDateInTomorrow:(NSDate *)date;
但是考慮到用戶是可以修改手機時間的艺智,通常我們會使用 ntp 時間作為標(biāo)準(zhǔn)時間,而不直接使用手機時間圾亏。
NSCalendar 也有提供了一個方法可以直接對比兩個時間十拣。
/*
This API compares the Days of the given dates, reporting them equal if they are in the same Day.
*/
- (BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 API_AVAILABLE(macos(10.9), ios(8.0), watchos(2.0), tvos(9.0));
但是,在實際場景中志鹃,比較兩個 NSDate 是否是同一天的時候夭问,通常需要兩個 NSDate 同時處于當(dāng)?shù)貢r區(qū)才有意義。
同樣的兩個時間曹铃,在一個時區(qū)是同一天缰趋,在另一個時區(qū)很可能不是同一天!!秘血!
如果你在東八區(qū)味抖,用兩個零時區(qū)的時間來對比,是會出很大的問題的灰粮。
舉個例子:
today 1553741981 零時區(qū) 2019-03-28 02:59:41 +0000 (東八區(qū) 2019-03-28 10:59:41)
day 1553788800 零時區(qū) 2019-03-28 15:59:59 +0000 (東八區(qū) 2019-03-29 00:00:00)