En Cocoa, ¿cómo uso NSTimeZone para obtener el desplazamiento de la zona horaria del sistema como una cadena?
-
20-08-2019 - |
Pregunta
Para PDT, me gustaría " -0700 " ;.
Tengo una cita en el pasado para determinar hace cuánto tiempo sucedió algo.
NSDate *then = [NSDate dateWithString:@"1976-04-01 12:34:56 -0700"]; // Note the hard-coded time zone at the end
Construiré la cadena de fecha en otro lugar, pero no sé cómo acceder a la zona horaria local.
Leí los Temas de programación de Apple Dates and Times para Cocoa, así como las Referencias de clase NSTimeZone y NSDate, pero es demasiado difícil para mí reunir la información. Realmente podría usar algunas líneas de código solo para mostrar cómo se usa.
Actualización : Mientras luchaba con esto, estaba escribiendo código usando una plantilla de Línea de Comando para poder probar las cosas rápidamente. Acabo de probar mi código anterior en iPhone y obtengo NSDate puede no responder a '+ dateWithString:' Lo siento si eso se agrega a la confusión, quién sabía que Apple cambiaría una clase tan básica.
Solución
El desplazamiento de la zona horaria depende de la fecha en gran parte del mundo & # 8212; aquellas partes que usan el horario de verano / horario de verano.
La única forma correcta es generar la cadena completa a partir de la fecha y la zona horaria juntas. Use NSDateFormatter para esto.
Otros consejos
Use NSDateFormatter
para construir NSDate a partir de una cadena:
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *formatterDate;
formatterDate = [inputFormatter dateFromString:@"1976-04-01 12:34:56 -0700"];
NSString *dateString = [inputFormatter stringFromDate:formatterDate];
NSLog(@"date:%@", dateString);
De esta forma obtiene la hora local de la cadena, por ejemplo, la fecha especificada por la cadena:
" 1976-04-01 12:34:56 -0700 "
está en la zona horaria - 0700
, (estoy en la zona horaria GMT +1000), así que obtengo:
2009-11-17 22: 13: 46.480 cmdline [10593: 903] fecha: 1976-04-02 05:34:56 +1000
La mejor manera es probablemente usar un formateador de calendario simple
NSCalendarDate * date = [NSCalendarDate calendarDate];
[date setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PDT"]];
NSLog([date descriptionWithCalendarFormat:@"%z"]);
que generará '-0700'
o omita la segunda línea si desea la zona horaria actual del sistema (no estoy seguro de qué estaba pidiendo)