2016-09-06 339 views
13

我正在試圖解決如何確定給定的時間戳是今天發生還是+1/-1天。從本質上講,我想這樣做(僞)Swift - 檢查一個時間戳是昨天,今天,明天還是X天前

IF days_from_today(timestamp) == -1 RETURN 'Yesterday' 
ELSE IF days_from_today(timestamp) == 0 RETURN 'Today' 
ELSE IF days_from_today(timestamp) == 1 RETURN 'Tomorrow' 
ELSE IF days_from_today(timestamp) < 1 RETURN days_from_today(timestamp) + ' days ago' 
ELSE RETURN 'In ' + days_from_today(timestamp) + ' ago' 

最重要的是,雖然,它需要在斯威夫特,我用的NSDate/NSCalendar對象掙扎。我開始工作了時差是這樣的:

let calendar = NSCalendar.currentCalendar() 
let date = NSDate(timeIntervalSince1970: Double(timestamp)) 
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour], 
    fromDate: date, toDate: NSDate(), options: NSCalendarOptions()) 

這種方式比較。然而是不容易的,因爲.Day取決於一天和時間戳的時間是不同的。在PHP中,我只是使用mktime根據一天的開始創建一個新日期(即mktime(0,0,0)),但我不確定在Swift中這樣做的最簡單方法。

有沒有人有關於如何解決這個問題的好主意?也許NSDate或類似的擴展是最好的?

回答

38

NSCalendar有三種情況

func isDateInYesterday(_ date: NSDate) -> Bool 
func isDateInToday(_ date: NSDate) -> Bool 
func isDateInTomorrow(_ date: NSDate) -> Bool 

的方法來計算比昨天早天使用

func components(_ unitFlags: NSCalendarUnit, 
     fromDate startingDate: NSDate, 
      toDate resultDate: NSDate, 
       options opts: NSCalendarOptions) -> NSDateComponents 

.DayunitFlags並獲得day p結果。

編輯:

這是通過剝離部分時間也考慮is in了較早和較晚日期的功能。

func dayDifferenceFromDate(timestamp : Int) -> String 
{ 
    let calendar = NSCalendar.currentCalendar() 
    let date = NSDate(timeIntervalSince1970: Double(timestamp)) 
    if calendar.isDateInYesterday(date) { return "Yesterday" } 
    else if calendar.isDateInToday(date) { return "Today" } 
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" } 
    else { 
    let startOfNow = calendar.startOfDayForDate(NSDate()) 
    let startOfTimeStamp = calendar.startOfDayForDate(date) 
    let components = calendar.components(.Day, fromDate: startOfNow, toDate: startOfTimeStamp, options: []) 
    let day = components.day 
    if day < 1 { return "\(abs(day)) days ago" } 
    else { return "In \(day) days" } 
    } 
} 

更新夫特3:

func dayDifference(from interval : TimeInterval) -> String 
{ 
    let calendar = NSCalendar.current 
    let date = Date(timeIntervalSince1970: interval) 
    if calendar.isDateInYesterday(date) { return "Yesterday" } 
    else if calendar.isDateInToday(date) { return "Today" } 
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" } 
    else { 
     let startOfNow = calendar.startOfDay(for: Date()) 
     let startOfTimeStamp = calendar.startOfDay(for: date) 
     let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp) 
     let day = components.day! 
     if day < 1 { return "\(abs(day)) days ago" } 
     else { return "In \(day) days" } 
    } 
} 
+0

謝謝!頂部看起來很完美。下半部分可能在上午10點,但時間戳可能在明天上午9點,如果明天上午11點會有不同的結果。或者我誤解了這是如何工作的? – Ben

+0

好東西,再次感謝。我做的唯一的改變是前幾天的行,通過添加一個'abs'來消除否定,即'返回「\(abs(天))天前」' – Ben

+0

當然,謝謝:-) – vadian

5

NSCalender具有可直接使用的新方法。

NSCalendar.currentCalendar().isDateInTomorrow(NDSate())//Replace NSDate() with your date 
NSCalendar.currentCalendar().isDateInYesterday() 
NSCalendar.currentCalendar().isDateInTomorrow() 

希望這有助於

25

夫特3.0:

NSCalendar.current.isDateInToday(yourDate) 
NSCalendar.current.isDateInYesterday(yourDate) 
NSCalendar.current.isDateInTomorrow(yourDate) 

此外:

NSCalendar.current.isDateInWeekend(yourDate) 

請注意,某些國家的週末可能與週六週日不同,這取決於日曆。

您還可以使用autoupdatingCurrent而不是current日曆來跟蹤用戶更新。你可以用同樣的方式:

NSCalendar.autoupdatingCurrent.isDateInToday(yourDate) 

更新:

您還可以使用Calendar,這對NSCalendar一個類型別名。

7

斯威夫特4更新:

let calendar = Calendar.current 
    let date = Date() 

    calendar.isDateInYesterday(date) 
    calendar.isDateInToday(date) 
    calendar.isDateInTomorrow(date)