2011-03-07 17 views
6

¿Soy estúpido? Todo este tiempo pensé que [NSDate date] devolvió la fecha y hora local. Después de tener algunos problemas con NSStringformatter/stringFromdate/dateFromString hoy noté que mi [NSDate date] volvía 2011-03-06 11:00:00 +0000. Después de investigar esto, veo que [NSDate date] devuelve una fecha bruta que siempre es GMT.¿[NSDate date] devuelve la fecha y hora local?

¿Para qué sirve la porción de desplazamiento gmt si siempre muestra +0000? Además, no entiendo [descripción de myDate]. Los documentos dicen que se supone que debe mostrar la compensación de gmt y la información de dst. Obtengo lo mismo que [NSDate date].

Conclusión para mí, si uso [NSDate date] para obtener la fecha actual y son más de las 2 pm, obtengo la fecha de mañana ya que estoy en el huso horario -10. Sin mencionar los problemas con los que me encontré hoy con NSDateformatter.

¿Estoy viendo esto correctamente? Lo curioso es que parece recordar haber visto [NSDate date] el 2011-03-06 11:00:00 -36000, o creo que estaba viendo 2011-03-06 11:00:00 -10000.

Puedo trabajar con eso, pero tal vez alguien pueda exponerlo para ayudarme a entender mejor NSDate.

+1

'+ [NSDate fecha]' devuelve un objeto de fecha que se libera automáticamente y tiene la hora actual. La razón por la que aparece igual que '- [NSDate description]' es que 'NSLog' usa la propiedad' description' de los objetos cuando '% @' está en uso. –

+0

@RadekS que debería ser una respuesta. Porque lo es :) – Alex

+0

@Alex respuesta parcial. –

Respuesta

20

NSDate devuelve la fecha actual. Aunque puede convertir ay desde el formato de cadena en diferentes configuraciones regionales/zonas horarias, NSDate no tiene un concepto interno de zona horaria. NSDates no están vinculados a ninguna región en particular. Si tú y cualquier otra persona en el mundo pidieras tus dispositivos a [fecha de NSDate] simultáneamente, obtendrías resultados iguales, no porque siempre regrese en GMT sino porque no regresa en una zona horaria específica. En Cocoa, una fecha es un momento específico en la historia de la Tierra. La forma de escribir una fecha está relacionada con su calendario, su zona horaria y su ubicación.

No recibirá la fecha de mañana, recibirá la fecha correcta y notará que da un día diferente si se expresa en GMT. Es la fecha correcta, simplemente escrita de forma diferente a lo que le gustaría.

'descripción' es un método anulado desde NSObject. Cuando NSLogge un objeto, lo que ocurre internamente es que se llama al método de descripción y se imprime la cadena devuelta. Por lo tanto, debe obtener resultados idénticos al iniciar sesión object y [object description], ya que la primera llama a la descripción e imprime esa cadena, la última llama a la descripción y llama a la descripción en la cadena resultante e imprime eso. NSStrings se devuelven a sí mismos como resultado de la descripción.

debe ser el comportamiento por defecto, pero para obtener una descripción significativa, intente:

NSLog(@"%@", [[NSDate date] descriptionWithCalendarFormat:nil 
      timeZone:[NSTimeZone localTimeZone] locale:[NSLocale currentLocale]]); 

Si aún así registra en GMT continuación, el dispositivo se cree que estar en GMT. No tengo idea de qué tan confiable es el simulador sobre ese tipo de cosas.

+0

Tommy, gracias. Eso fue muy útil. Con respecto a su declaración al respecto, me da la fecha de mañana. Veo su punto, pero para mí estaba esperando obtener la fecha en mi zona horaria (fecha y hora local), así que para mí es la fecha del día siguiente. Creo que este es solo un caso de semántica, pero a todos los efectos, no [NSDate date] devuelve GMT ya que GMT es la zona horaria cero. Gran respuesta, gracias. – user278859

+0

¿Te importaría responder una pregunta más? Tengo problemas para entender lo que dice la documentación sobre [NSTimeZone localTimeZone]. Dice que "Devuelve un objeto que reenvía todos los mensajes a la zona horaria predeterminada para la aplicación actual". Qué significa eso. Para mí, implica que llamarlo de alguna manera afecta las operaciones posteriores con fechas u horas. Gracias. – user278859

+0

Creo que la redacción ligeramente indirecta es solo porque el objeto devuelto por localTimeZone permanece semánticamente correcto incluso si la zona horaria cambia, mientras que la hora por defecto no lo hace. Entonces, el primer objeto parece actualizarse automáticamente, pero el segundo no. Que internamente es un nivel extra de indirección, pero parece que probablemente nos han dicho más de lo que necesitamos saber sobre la implementación allí. – Tommy

-1

En Swift:

NSDate() nos da la descripción de una fecha agnóstico, siempre devuelve la UTC + 0 fecha y hora, independientemente de la zona horaria del dispositivo:

print(NSDate()) 

.descriptionWithLocale (NSLocale.currentLocale())! nos da descripción UTC + N de fecha y hora de una fecha localizada donde N representa el desplazamiento (positivo o negativo) entre UTC + 0 y la corriente de fecha y hora local:

print(NSDate().descriptionWithLocale(NSLocale.currentLocale())!) 
+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. –

+0

Actualmente estoy trabajando con NSDate, por lo que mejoraré mi respuesta y explicación gradualmente. –

+0

'NSDate' no tiene zona horaria. No es UTC + 0. – Sulthan

Cuestiones relacionadas