2011-03-12 19 views
12

que tienen esta fecha formateador:¿Horas en NSDate todo el tiempo en estilo de 24 horas?

NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init]; 
[timeFormatter setDateFormat:@"HH:mm"]; 

Si uso esto:

NSDate *myDate = [timeFormatter dateFromString:@"13:00"]; 

Devuelve esto:

"1:00" 

Esto se debe a que el simulador se ha apagado 24 horas. Pero para mi aplicación que realmente necesito "13:00" en lugar de "1:00"

--- EDIT 1 ---

Añadido nuevo código:

NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init]; 
[timeFormatter setDateFormat:@"HH:mm"]; 
NSDate *timeForFirstRow = [timeFormatter dateFromString:@"13:00"]; 
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:timeForFirstRow]; 
NSInteger hour = [dateComponents hour]; //This will be 1 instead of 13 
NSInteger minute = [dateComponents minute]; 
+0

puedo mostrar el código en el que está mostrando el "retorno"? – falconcreek

Respuesta

25

Si quiere forzarlo a 12 horas o el modo de 24 horas, independientemente de la configuración del modo de 24/12 horas del usuario, debe establecer la configuración regional del formateador de fecha en en_US_POSIX (durante 12 horas) o, por ejemplo, en_GB para el modo de 24 horas.

Es decir,

NSLocale* formatterLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] autorelease]; 
[timeFormatter setLocale:formatterLocale]; 

Algunos más sobre esto aquí:

http://developer.apple.com/iphone/library/qa/qa2010/qa1480.html

+0

He jugado con tu respuesta y funciona ahora ... –

+0

Gracias por esta gran solución ... –

+0

¡gran solución! Me frustré una vez. porque dios encontré esto. –

8

tuve este mismo problema hace poco y me encontré con este documento que enumera todos los patrones de formato de fecha: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Pude trabajar 24 veces simplemente usando k: mm como formato de fecha:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"k:mm"]; 
1

De Apple Documentation, las cadenas de formato de tiempo siguen Unicode Technical Standard #35.

Como se indica en UTR # 35, mayúscula HH le da un tiempo de 24 horas, mientras que la minúscula hh le da un tiempo de estilo de 12 horas.

En resumen, si usted necesita el estilo 24 horas, utilice [timeFormatter setDateFormat:@"HH:mm"]; y si necesita estilo de 12 horas, utilice [timeFormatter setDateFormat:@"hh:mm"];

+2

De acuerdo con [Apple docs] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW13): " En iOS, el usuario puede anular la configuración predeterminada de AM/PM frente a la hora de 24 horas. Esto puede causar que NSDateFormatter reescriba la cadena de formato que estableció. " –

+1

@Patrick, sí, esto es cierto, si configuro mi dispositivo a 12 horas, el tiempo devuelto es de 12 horas. – Leon

+0

Esta es la mejor respuesta, ya que no tiene que falsificar la ubicación. –

1

Tienes que dos pasos aquí

NSLocale* locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[formatter setLocale:locale]; 

[formatter setDateFormat:@"hh:mm a"]; 

aquí en el formateador da am/pm formato

0

Si se ayuda a nadie solo he tenido un problema por el que quiero mostrar la hora para el usuario en la forma en que se han fijado en su dispositivo:

let timeFormatter = NSDateFormatter() 
timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle 
//get the time from the picker 

El enviar la hora de nuestra API en 24 estilo:

timeFormatter.locale = NSLocale(localeIdentifier: "en_GB") 
//get the time again 
Cuestiones relacionadas