2014-07-02 7 views
12

Ich habe ein Datum "2014-07-02 20:57:38 +0000" und ich möchte es als "heute um 20:57 Uhr" formatieren. Ich möchte, dass wenn ein String gestern ist, dann zeige es als "Gestern um 9:00 Uhr". Wenn es weder heute noch gestern ist, zeigen Sie einfach das tatsächliche Datum wie "27/6 um 19:53 Uhr" an.Wie zeigt man das Datum mit einer menschlichen Sprache wie "Heute um xx: xx pm", "Gestern um xx: xx" an?

Ich konnte die Zeit mit Format wie "8:57 AM" mit dem Code unten erhalten.

  var formatter : NSDateFormatter = NSDateFormatter() 
      formatter.dateFormat = "h:mm a" 

      // message.createdAt is the date 
      let dateString = formatter.stringFromDate(message.createdAt) 
      println(dateString) 

      //output = 8:57 AM 

Wenn ich jedoch den folgenden Code verwende, wird eine leere Zeichenfolge zurückgegeben.

Wie mache ich das funktionieren und zeigen "Heute" oder "Gestern" in Swift?

+0

** Swift 3 Antwort: ** https://stackoverflow.com/a/46027060/3400991 –

Antwort

16

Der Grund dafür ist, dass Ihr Datumsformat nur Zeitkomponenten enthält. Kombiniert mit .doesRelativeDateFormatting, die Ihnen die leere Zeichenfolge gibt. Wenn Sie die benutzerdefinierte Zeitformat wollen, ich glaube, Sie trennen Formatierer für das Datum und die Zeit brauchen:

let now = NSDate() 

let dateFormatter = NSDateFormatter() 
dateFormatter.dateStyle = .MediumStyle 
dateFormatter.doesRelativeDateFormatting = true 

let timeFormatter = NSDateFormatter() 
timeFormatter.dateFormat = "h:mm a" 

let time = "\(dateFormatter.stringFromDate(now)), \(timeFormatter.stringFromDate(now))" 
println(time)  // prints "Today, 5:10 PM" 
+2

Eigentlich nur ein benötigen. Sie können es gerne tun: var Formatierer: NSDateFormatter = NSDateFormatter() formatter.dateStyle = NSDateFormatterStyle.ShortStyle formatter.timeStyle = NSDateFormatterStyle.ShortStyle formatter.doesRelativeDateFormatting = true var datestring = formatter.stringFromDate (NSDate()) –

+0

Diese Lösung bietet nicht die richtige Zeit für die meisten Zeitzonen und Sommer-/Winterzeiten. Siehe unter Lösung von Zyklonen. – Vincent

4

dies einen Versuch geben

let dateFormatter = NSDateFormatter() 
dateFormatter.dateStyle = .ShortStyle 
dateFormatter.timeStyle = .ShortStyle 
dateFormatter.doesRelativeDateFormatting = true 

let date = NSDate() 
let dateString = dateFormatter.stringFromDate(date) 
+0

Es heißt "NSDateFormatter hat kein Mitglied namens localizedStringFromDate" –

+0

@HenryNgan Sorry erkannte nicht, dass es sich um eine Klassenmethode handelte, die jetzt bearbeitet wurde –

5

Mit Swift 3, Apple Developer-API-Referenz besagt, über DateFormatter ‚s dateFormat Eigenschaft:

Sie nur diese Eigenschaft festlegen sollten, wenn sie mit festem Format Darstellungen arbeiten, wie in Working With Fixed Format Date Representations diskutiert. Für benutzerfreundliche Darstellungen sollten Sie die Eigenschaften dateStyle und timeStyle oder die setLocalizedDateFormatFromTemplate(_:)-Methode verwenden, wenn das gewünschte Format nicht mit den vordefinierten Stilen erreicht werden kann. Diese beiden Eigenschaften und diese Methode stellen eine lokalisierte Datumsdarstellung dar, die für die Anzeige für den Benutzer geeignet ist.


DateFormatterdateStyle Eigenschaft hat die folgende Erklärung abgegeben:

Das Datum Stil des Empfängers.

var dateStyle: DateFormatter.Style { get set } 

In gleicher Weise hat DateFormattertimeStyle Eigentum folgende Erklärung ab:

Die Zeit Stil des Empfängers.

var timeStyle: DateFormatter.Style { get set } 

Beachten Sie, dass DateFormatter.Style ist eine Enumeration mit den folgenden Fällen: none, short, medium, long, full.

Beachten Sie auch, dass doesRelativeDateFormatting funktioniert nur, wenn Sie dateStyle und/oder timeStyle für Sie DateFormatter Instanz festgelegt.mit DateFormatterdateStyle und timeStyle Eigenschaften


Der folgende Spielplatz Code zeigen, wie Sie Ihre Reisedaten in dem gewünschten Format angezeigt werden soll.

import Foundation 

let now = Date() // 2017-03-12 14:53:34 +0000 
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! // 2017-03-11 14:53:34 +0000 
let aWeekAgo = Calendar.current.date(byAdding: .weekOfMonth, value: -1, to: now)! // 2017-03-05 14:53:34 +0000 

let dateFormatter = DateFormatter() 
dateFormatter.dateStyle = .long 
dateFormatter.timeStyle = .short 
dateFormatter.doesRelativeDateFormatting = true 

let nowString = dateFormatter.string(from: now) 
print(nowString) // prints: Today at 3:53 PM 

let yesterdayString = dateFormatter.string(from: yesterday) 
print(yesterdayString) // prints: Yesterday at 3:53 PM 

let aWeekAgoString = dateFormatter.string(from: aWeekAgo) 
print(aWeekAgoString) // prints: March 5, 2017 at 3:53 PM 
Verwandte Themen