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()
希望这可以帮助