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
通.Day
到unitFlags
并获得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" }
}
}
答
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)
谢谢!顶部看起来很完美。下半部分可能在上午10点,但时间戳可能在明天上午9点,如果明天上午11点会有不同的结果。或者我误解了这是如何工作的? – Ben
好东西,再次感谢。我做的唯一的改变是前几天的行,通过添加一个'abs'来消除否定,即'返回“\(abs(天))天前”' – Ben
当然,谢谢:-) – vadian