ios - hobba - Swift: comprueba si una marca de tiempo es ayer, hoy, mañana o X días
hartico (4)
Actualización de Swift 4:
let calendar = Calendar.current
let date = Date()
calendar.isDateInYesterday(date)
calendar.isDateInToday(date)
calendar.isDateInTomorrow(date)
Estoy tratando de averiguar cómo decidir si una marca de tiempo dada ocurre hoy, o +1 / -1 días. Esencialmente, me gustaría hacer algo como esto (Pseudocódigo)
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''
Sin embargo, es crucial que esté en Swift y estoy luchando con los objetos NSDate / NSCalendar. Comencé con la diferencia horaria como esta:
let calendar = NSCalendar.currentCalendar()
let date = NSDate(timeIntervalSince1970: Double(timestamp))
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour],
fromDate: date, toDate: NSDate(), options: NSCalendarOptions())
Sin embargo, la comparación de esta manera no es fácil, porque el .Day
es diferente según la hora del día y la marca de tiempo. En PHP, solo uso mktime para crear una nueva fecha, basada en el inicio del día (es decir, mktime(0,0,0)
), pero no estoy seguro de mktime(0,0,0)
es la forma más fácil de hacerlo en Swift.
¿Alguien tiene una buena idea sobre cómo abordar esto? Tal vez una extensión a NSDate o algo similar sería mejor?
NSCalender tiene nuevos métodos que puede utilizar directamente.
NSCalendar.currentCalendar().isDateInTomorrow(NDSate())//Replace NSDate() with your date
NSCalendar.currentCalendar().isDateInYesterday()
NSCalendar.currentCalendar().isDateInTomorrow()
Espero que esto ayude
NSCalendar
tiene métodos para los tres casos.
func isDateInYesterday(_ date: NSDate) -> Bool
func isDateInToday(_ date: NSDate) -> Bool
func isDateInTomorrow(_ date: NSDate) -> Bool
Para calcular los días anteriores a ayer use.
func components(_ unitFlags: NSCalendarUnit,
fromDate startingDate: NSDate,
toDate resultDate: NSDate,
options opts: NSCalendarOptions) -> NSDateComponents
Pase .Day
a unitFlags
y obtenga la propiedad del day
del resultado.
Editar:
Esta es una función que considera que también is in
para fechas anteriores y posteriores al eliminar la parte del tiempo.
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" }
}
}
Actualización para 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 / 4.0:
Calendar.current.isDateInToday(yourDate)
Calendar.current.isDateInYesterday(yourDate)
Calendar.current.isDateInTomorrow(yourDate)
Adicionalmente:
Calendar.current.isDateInWeekend(yourDate)
Tenga en cuenta que para algunos países, el fin de semana puede ser diferente al sábado a domingo, depende del calendario.
También puede usar autoupdatingCurrent
lugar del calendario current
que hará un seguimiento de las actualizaciones de los usuarios. Puedes usarlo de la misma manera:
Calendar.autoupdatingCurrent.isDateInToday(yourDate)
Calendar
es un alias de tipo para el NSCalendar
.