2010-01-14 8 views
25

Estoy trabajando con Objective C para iPhone y tengo un NSDate que quiero mostrar con todo el estilo pero sin el año. En este momento estoy usando el siguiente código pero también muestra el año, y no quiero eso. Como quiero mostrar la fecha en el formato de región correcto, no puedo simplemente eliminar el año al final, ya que en algunos países el año no estará al final, sino en el medio o al principio.NSDate con todo el estilo pero sin año

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 

¿Cuál es la solución para esto? Y otra pregunta, ¿dónde puedo encontrar información sobre cómo usar setDateFormat de NSDateFormatter? No puedo encontrar información sobre qué representan las diferentes letras en la API.

Respuesta

28

Sé que esta es una pregunta muy antigua, pero esta es la única que encontré en SO que habló sobre el mismo problema que estaba teniendo.

El método clave para usar aquí es: dateFormatFromTemplate

En lugar de establecer el estilo, que desea establecer el formato como tal:

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); 

agradecimiento especial a: http://oleb.net/blog/2011/11/working-with-date-and-time-in-cocoa-part-2/

+0

Wow, esto funcionó a las mil maravillas. –

+0

Esta debería ser la respuesta aceptada. – CristiC

8

Recibió la excelente respuesta de @Joss en una extensión de Swift:

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

Aquí es una opción rápida para mostrar simplemente Mes Fecha en una etiqueta:

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

La pregunta establece específicamente "Quiero mostrar la fecha en el formato de región correcto". –

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 

Juego con template para satisfacer sus necesidades.

Doc y ejemplos here para ayudarle a determinar el patrón que desea.

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) 
    } 
} 
Cuestiones relacionadas