Swift - 检查一个时间戳是昨天,今天,明天还是X天前

问题描述:

我正在试图解决如何确定给定的时间戳是今天发生还是+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或类似的扩展是最好的?

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

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

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

希望这有助于

夫特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一个类型别名。

斯威夫特4更新:

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

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