Swift – 检查时间戳是昨天,今天,明天,还是X天前

我正在努力研究如何确定一个给定的时间戳是在今天发生,还是+1 / -1天。 本质上,我想要做这样的事情(伪代码)

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' 

至关重要的是,它需要在Swift中,我正在努力与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创build一个新的date,基于一天的开始(即mktime(0,0,0) ),但我不确定在Swift中最简单的方法。

有没有人有如何处理这个问题的好主意? 也许NSDate或类似的扩展是最好的?

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 

.Day传递给unitFlags并从结果中获取day属性。

编辑:

这是一个function,它也考虑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" } } } 

Swift 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" } } } 

Swift 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的types别名。

NSCalender有新的方法,您可以直接使用。

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

希望这可以帮助