Ich versuche herauszufinden, wie ich entscheiden kann, ob ein bestimmter Zeitstempel heute oder +1 / -1 Tage auftritt. Im Wesentlichen möchte ich so etwas machen (Pseudocode)
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'
Entscheidend ist jedoch, dass es in Swift sein muss und ich Probleme mit den NSDate / NSCalendar-Objekten habe. Ich begann damit, den Zeitunterschied wie folgt zu berechnen:
let calendar = NSCalendar.currentCalendar()
let date = NSDate(timeIntervalSince1970: Double(timestamp))
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour],
fromDate: date, toDate: NSDate(), options: NSCalendarOptions())
Ein Vergleich auf diese Weise ist jedoch nicht einfach, da er .Day
je nach Tageszeit und Zeitstempel unterschiedlich ist. In PHP würde ich nur mktime verwenden, um ein neues Datum zu erstellen, basierend auf dem Beginn des Tages (dh mktime(0,0,0)
), aber ich bin mir nicht sicher, wie ich das in Swift am einfachsten machen kann.
Hat jemand eine gute Idee, wie man das angeht? Vielleicht wäre eine Erweiterung auf NSDate oder ähnliches am besten?
quelle
abs
, um die Negation zu entfernen, dhreturn "\(abs(day)) days ago"
Swift 3/4/5:
Calendar.current.isDateInToday(yourDate) Calendar.current.isDateInYesterday(yourDate) Calendar.current.isDateInTomorrow(yourDate)
Zusätzlich:
Calendar.current.isDateInWeekend(yourDate)
Beachten Sie, dass das Wochenende in einigen Ländern vom Samstag bis Sonntag abweichen kann. Dies hängt vom Kalender ab.
Sie können auch
autoupdatingCurrent
anstelle descurrent
Kalenders verwenden, um Benutzeraktualisierungen zu verfolgen. Sie verwenden es auf die gleiche Weise:Calendar.autoupdatingCurrent.isDateInToday(yourDate)
Calendar
ist ein Typalias für dieNSCalendar
.quelle
Swift 4 Update:
let calendar = Calendar.current let date = Date() calendar.isDateInYesterday(date) calendar.isDateInToday(date) calendar.isDateInTomorrow(date)
quelle
Date()
bringt es , das aktuelle Datum ( ) zu nehmen und zu überprüfen, ob es gestern oder morgen ist? Es sieht so aus, als wollten Sie etwas in einem kopierten Code ändern ...NSCalender verfügt über neue Methoden, die Sie direkt verwenden können.
NSCalendar.currentCalendar().isDateInTomorrow(NSDate())//Replace NSDate() with your date NSCalendar.currentCalendar().isDateInYesterday() NSCalendar.currentCalendar().isDateInTomorrow()
Hoffe das hilft
quelle
Verwenden Sie unter Swift 5 und iOS 13 den RelativeDateTimeFormatter.
let formatter = RelativeDateTimeFormatter() formatter.dateTimeStyle = .named formatter.localizedString(from: DateComponents(day: -1)) // "yesterday" formatter.localizedString(from: DateComponents(day: 1)) // "Tomorrow" formatter.localizedString(from: DateComponents(hour: 2)) // "in 2 hours" formatter.localizedString(from: DateComponents(minute: 45)) // "in 45 minutes"
quelle
1) Gemäß Ihrem Beispiel möchten Sie die Bezeichnungen "Gestern", "Heute" usw. erhalten. IOS kann dies standardmäßig tun:
https://developer.apple.com/documentation/foundation/nsdateformatter/1415848-doesrelativedateformatting?language=objc
2) Wenn Sie Ihr benutzerdefiniertes Etikett berechnen wollen , wenn iOS diese Etiketten selbst nicht hinzufügen dann alternativ können Sie 2 verwenden
DateFormatter
Objekte mit beidendoesRelativeDateFormatting == true
unddoesRelativeDateFormatting == false
vergleichen , wenn ihr Ergebnis Datum Strings gleich oder verschieden sindquelle