2010-01-14 8 views
25

Ich arbeite mit Objective C für iPhone und habe ein NSDate, das ich in vollem Stil, aber ohne das Jahr anzeigen möchte. Im Moment benutze ich den Code unten, aber es zeigt auch das Jahr, und das möchte ich nicht. Da ich das Datum im richtigen Regionformat anzeigen möchte, kann ich das Jahr nicht einfach am Ende löschen, da das Jahr in einigen Ländern nicht am Ende, sondern in der Mitte oder am Anfang sein wird.NSDate in vollem Stil, aber ohne Jahr

NSDate *testdate = [NSDate date]; 
NSDateFormatter *dateFormattertest = [[NSDateFormatter alloc] init]; 
[dateFormattertest setDateStyle:NSDateFormatterFullStyle]; 
[dateFormattertest setTimeStyle:NSDateFormatterNoStyle]; 
NSString *formattedDateString = [dateFormattertest stringFromDate:testdate]; 
NSLog(formattedDateString); 

In US this give me: 
Thursday, January 14, 2010 

In Sweden this give me: 
torsdag, 2010 januari 14 

Was ist die Lösung dafür? Und noch eine Frage, wo finde ich Informationen zur Verwendung von setDateFormat von NSDateFormatter? Ich kann keine Informationen darüber finden, wofür verschiedene Buchstaben in der API stehen.

Antwort

28

Ich weiß, das ist eine ziemlich alte Frage, aber dies ist die einzige, die ich auf SO gefunden habe, die über das gleiche Problem sprach, das ich hatte.

Der Schlüssel Methode hier zu verwenden ist: dateFormatFromTemplate

Statt den Stil der Einrichtung, möchten Sie das Format als solche setzen:

NSDate *testdate = [NSDate date]; 

NSLocale *currentLocale = [NSLocale currentLocale]; 

// Set the date components you want 
NSString *dateComponents = @"EEEEMMMMd"; 

// The components will be reordered according to the locale 
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:currentLocale]; 
NSLog(@"Date format for %@: %@", [currentLocale displayNameForKey:NSLocaleIdentifier value:[currentLocale localeIdentifier]], dateFormat); 

NSDateFormatter *dateFormatter =[[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:dateFormat]; 

NSString *formattedDateString = [dateFormatter stringFromDate:testdate]; 
NSLog(formattedDateString); 

Besonderer Dank geht an: http://oleb.net/blog/2011/11/working-with-date-and-time-in-cocoa-part-2/

+0

Wow, arbeitete diese wie ein Zauber. –

+0

Dies sollte die akzeptierte Antwort sein. – CristiC

8

Nahm @Joss große Antwort auf eine Swift-Erweiterung:

extension NSDate { 
    func formattedFromCompenents(styleAttitude: NSDateFormatterStyle, year: Bool = true, month: Bool = true, day: Bool = true, hour: Bool = true, minute: Bool = true, second: Bool = true) -> String { 
     let long = styleAttitude == .LongStyle || styleAttitude == .FullStyle 
     var comps = "" 

     if year { comps += long ? "yyyy" : "yy" } 
     if month { comps += long ? "MMMM" : "MMM" } 
     if day { comps += long ? "dd" : "d" } 

     if hour { comps += long ? "HH" : "H" } 
     if minute { comps += long ? "mm" : "m" } 
     if second { comps += long ? "ss" : "s" } 

     let format = NSDateFormatter.dateFormatFromTemplate(comps, options: 0, locale: NSLocale.currentLocale()) 
     let formatter = NSDateFormatter() 
     formatter.dateFormat = format 
     return formatter.string(from: self) 
    } 
} 
-5

Hier ist eine schnelle Möglichkeit, nur Monat Datum auf einem Etikett zu zeigen:

let todaysDate: NSDate = NSDate() 
let formatter = NSDateFormatter() 
formatter.dateFormat = "MMMM dd" 
self.todayLabel.text = formatter.stringFromDate(todaysDate) 
+0

Die Frage besagt ausdrücklich "Ich möchte das Datum im richtigen Region-Format anzeigen". –

5

Swift 3

let template = "EEEEdMMM" 

    let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: NSLocale.current) 
    let formatter = DateFormatter() 
    formatter.dateFormat = format 

    let now = Date() 
    let whatYouWant = formatter.string(from: now) // ex: Sunday, Mar 5 

Wiedergabe mit template Ihre Bedürfnisse anzupassen.

Doc und Beispiele here, um Ihnen zu helfen, das Muster zu bestimmen, das Sie wollen.

2

Swift 4

extension Date { 
    public func formattedFromComponents(styleAttitude: DateFormatter.Style, year: Bool = false, month: Bool = false, day: Bool = false, hour: Bool = false, minute: Bool = false, second: Bool = false, locale: Locale = Locale.current) -> String { 
     let long = styleAttitude == .long || styleAttitude == .full 
     let short = styleAttitude == .short 
     var comps = "" 

     if year { comps += long ? "yyyy" : "yy" } 
     if month { comps += long ? "MMMM" : (short ? "MM" : "MMM") } 
     if day { comps += long ? "dd" : "d" } 

     if hour { comps += long ? "HH" : "H" } 
     if minute { comps += long ? "mm" : "m" } 
     if second { comps += long ? "ss" : "s" } 
     let format = DateFormatter.dateFormat(fromTemplate: comps, options: 0, locale: locale) 
     let formatter = DateFormatter() 
     formatter.dateFormat = format 
     return formatter.string(from: self) 
    } 
} 
Verwandte Themen