2011-03-03 23 views
7

Deseo poder obtener la fecha y hora local dondequiera que se ejecute mi aplicación, según la configuración del iPhone. Específicamente, necesito que la fecha sea de formato mm/dd o dd/mm (o dd.mm, mm.dd, dd-mm, mm-dd, etc.) dependiendo de la configuración regional, y el tiempo es hh: mm. ¿Es esto posible con alguna combinación de métodos SDK?Fecha localizada (mes y día) y hora con NSDate

Gracias!

Respuesta

6

Bueno, creo que el siguiente código funciona para lo que necesito:

NSString *dateComponents = @"yMMd"; 
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:[NSLocale currentLocale]]; 
NSArray *tmpSubstrings = [dateFormat componentsSeparatedByString:@"y"]; 
NSString *tmpStr; 
NSRange r; 
if ([[tmpSubstrings objectAtIndex:0] length] == 0) { 
    r.location = 1; 
    r.length = [[tmpSubstrings objectAtIndex:1] length] - 1; 
    tmpStr = [[tmpSubstrings objectAtIndex:1] substringWithRange:r]; 
} else { 
    r.location = 0; 
    r.length = [[tmpSubstrings objectAtIndex:0] length] - 1; 
    tmpStr = [[tmpSubstrings objectAtIndex:0] substringWithRange:r]; 
} 
NSString *newStr = [[NSString alloc] initWithFormat:@"%@ H:mm", tmpStr]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:newStr]; 
NSString *formattedDateString = [formatter stringFromDate:[NSDate date]]; 
13

he modificado el código para que sólo se necesita la fecha y el tiempo de espera del objeto NSDate sin cambios:

NSDate* date = [NSDate date]; 
NSString* datePart = [NSDateFormatter localizedStringFromDate: date 
                dateStyle: NSDateFormatterShortStyle 
                timeStyle: NSDateFormatterNoStyle]; 
NSString* timePart = [NSDateFormatter localizedStringFromDate: date 
                dateStyle: NSDateFormatterNoStyle 
                timeStyle: NSDateFormatterShortStyle]; 
NSLog(@"Month Day: %@", datePart); 
NSLog(@"Hours Min: %@", timePart); 
+0

Eso funciona bien. Sin embargo, si la fecha localizada tiene el año primero, entonces este código se rompe, ¿no es así? – DNewell

+0

Es cierto. ¿Hay una localización que hace tal cosa? El problema es que no tenemos una manera confiable de determinar qué número es el año de la cadena. Su mejor opción sería no tratar de modificar lo que sale de DateFormatter ... He modificado el código en mi respuesta para hacer precisamente eso. –

+0

Si echas un vistazo a mi código, la línea que obtiene el formato de fecha es el secreto. Eso me da el formato localizado: y/MM/d o d/MM/a o MM/d/a o lo que sea. Una vez que elimine y el separador, puedo usar esa cadena para el argumento setDateFormat para el formateador, y obtener la fecha localizada apropiada sin el año. – DNewell

Cuestiones relacionadas