Rasche Konvertierung von Zeit zu Zeit
In Swift5, wir haben RelativeDateTimeFormatter
Vor Swift5:
Ich versuche, zu konvertieren und zu mal vor, was ich tun möchte, ist:
von 1 bis 15 Sekunden wird es sagen, " Nur jetzt "
von 60 Minuten bis 119 Minuten, wird sagen, " vor einer Stunde "
von 24 Stunden bis 47 Stunden wird es sagen, " Gestern "
ab 7 Tage bis 7 Tage und 23 Stunden wird es sagen, " vor einer Woche "
Ich bin mir nicht sicher über meine zu zählen, wenn ich falsch fühlen Sie sich frei, um es zu beheben für mich
Hier ist der code
extension NSDate {
struct Date {
static let timeFormatter: NSDateFormatter = {
let df = NSDateFormatter()
df.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
df.dateFormat = "h:mm a"
return df
}()
}
var time: String { return Date.timeFormatter.stringFromDate(self) }
var year: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Year, fromDate: self) }
var month: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Month, fromDate: self) }
var day: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Day, fromDate: self) }
var hour: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Hour, fromDate: self) }
var minute: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Minute, fromDate: self) }
var second: Int { return NSCalendar.autoupdatingCurrentCalendar().component(.Second, fromDate: self) }
struct DateComponents {
static let formatter: NSDateComponentsFormatter = {
let dcFormatter = NSDateComponentsFormatter()
dcFormatter.calendar = NSCalendar(identifier: NSCalendarIdentifierISO8601)!
dcFormatter.unitsStyle = .Full
dcFormatter.maximumUnitCount = 1
dcFormatter.zeroFormattingBehavior = .Default
dcFormatter.allowsFractionalUnits = false
dcFormatter.allowedUnits = [.Year, .Month, .Weekday, .Day, .Hour, .Minute, .Second]
return dcFormatter
}()
}
var elapsedTime: String {
if isecond(NSDate()) {
return "Just now"
}
if ishour(NSDate()) {
return "an hour ago"
}
if isyesterday(NSDate()) {
return "Yesterday"
}
if isweek(NSDate()) {
return "a week ago"
}
return (DateComponents.formatter.stringFromTimeInterval(NSDate().timeIntervalSinceDate(self)) ?? "") + " ago"
}
func isyesterday(date: NSDate) -> Bool {
return NSCalendar.autoupdatingCurrentCalendar().isDate(self, inSameDayAsDate: date.yesterday)
}
var yesterday: NSDate {
return NSCalendar.autoupdatingCurrentCalendar().dateWithEra(1, year: year, month: month, day: day-1, hour: 0, minute: 0, second: 0, nanosecond: 0)!
}
func isweek(date: NSDate) -> Bool {
return NSCalendar.autoupdatingCurrentCalendar().isDate(self, inSameDayAsDate: date.weekago)
}
var weekago: NSDate {
return NSCalendar.autoupdatingCurrentCalendar().dateWithEra(1, year: year, month: month, day: day-7, hour: 0, minute: 0, second: 0, nanosecond: 0)!
}
func isecond(date: NSDate) -> Bool {
return NSCalendar.autoupdatingCurrentCalendar().isDate(self, inSameDayAsDate: date.secondsago)
}
var secondsago: NSDate {
return NSCalendar.autoupdatingCurrentCalendar().dateWithEra(1, year: year, month: month, day: 0, hour: 0, minute: 0, second: second-15, nanosecond: 0)!
}
func ishour(date: NSDate) -> Bool {
return NSCalendar.autoupdatingCurrentCalendar().isDate(self, inSameDayAsDate: date.hourago)
}
var hourago: NSDate {
return NSCalendar.autoupdatingCurrentCalendar().dateWithEra(1, year: year, month: month, day: 0, hour: hour-1, minute: minute-1, second: 0, nanosecond: 0)!
}
}
hier, was ich in meiner app :
Anführungszeichen, die "vor einer Stunde" , "Nur jetzt", etc nicht angezeigt, nur "Gestern" und ich bin mir nicht sicher, ob es von 7 Tage und 23 Stunden nur!
und hier ist meine erste Frage link : Swift, Wie zu konvertieren Analysieren createdAt Zeit zu Zeit?
Mir bitte helfen, korrigieren Sie den code,
Dank @Leo Dabus für den code.
- Wer von Ihnen positiv bewertet werden, diese Frage??? "hilf mir fix den code" - in welcher Weise, Sie zeigen nur Codes, ist es nicht funktioniert, abstürzt, compiler-Fehler, Laufzeitfehler, funktioniert nicht wie erwartet?
- original-Frage und Antwort: stackoverflow.com/questions/34439560/...
- Sorry, der code funktioniert, es gibt keine crash-oder compiler-Fehler, aber den code nicht zählen, wie ich es erwartet
- Was ist es dann tun, im Gegensatz zu dem, was Sie erwarten, geben ein paar (!!!) Beispiel input - /output-Szenarien
- seine irgendwie schwer, mich zum Beispiel, dass, ich glaube es zählen auch, aber nicht mit meinen Zitaten auf Zeit, wie wenn die Zeit ist zwischen 1-16secs nicht zeigen, "Einfach jetzt"
- Was ist es dann zeigen, zeigen einige Eingabe-und die Ausgabe -, wo ist das problem dabei? Was sind Sie Einsenden, was da raus kommt? Was würden Sie kommen wollen, haben Sie versucht, Debuggen? Hinzugefügt log-Anweisungen?
- warum haben Sie sich einiges ändern read-only berechneten Eigenschaften wie var isDateInToday: Bool { return NSCalendar.autoupdatingCurrentCalendar().isDateInToday(self) } var isDateInYesterday: Bool { return NSCalendar.autoupdatingCurrentCalendar().isDateInYesterday(self) } ?
- Sie Bearbeiten sollte Ihre Frage und zeigen nur die elapsedTime Teil der Frage und poste einen link zu der anderen Frage/Antwort
- Dank Frage bearbeitet, Und ich weiß nicht, was ich verändert habe in den code, weil ich versuche, es zu tun
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde einfach ein update der Truongky Antwort für Swif 3:
Wenn Sie lieber eine lokalisierbare Antwort anstatt nur Englisch in diesem code wird die Arbeit
Swift 4+ Version
Nutzung
toDate
ist nicht definiert (sollte ein parameter).Ändern Sie den text wie Sie wollen.
Swift 3-version von truongky code:
Mit Date statt NSDate: Antwort unter:
Wie zu verwenden
Meine Bedürfnisse sind einfacher, entweder "jetzt" oder "x-Wochen"
Seit iOS 8 können Sie mit (NS)DateComponentsFormatter
z.B.
nun
10m vor
1h vor
1d gemeldet
1mo gemeldet
1y ago
Swift 4.1. Übergeben Sie das Datum in der Funktion param und Funktion zurückgeben letzten Zeit.
Müssen Sie dieses Datum extension in deiner helper-Klasse oder den im swift-Datei. Swift 4.2 . wenn Sie möchten, in swift 3 einfach kommentieren Sie die auskommentierte Zeile und kommentieren Sie die nächste Zeile.
Und rufen Sie die Methode wie folgt:
yourDate ist das Datum, das zu ändern
Hier ist eine Lösung, Sie können kopieren Sie
anrufen, verwenden Sie einfach
Swift 4-version von truongky code:
Und Fügen Sie Optional für TimeEnd jetzt nicht.
Auf Swift 5 verwenden Sie die RelativeDateTimeFormatter,
legen Sie die dateTimeStyle bekommen lokalisiert deictic Aussagen z.B. -