2011-07-28 8 views
7

Mi país se encuentra en GMT + 0. Estamos a más de 1 hora, porque estamos en horario de verano.iPhone - fecha actual teniendo en cuenta el horario de verano

Cuando hago

[NSDate date]; 

se supone que devuelve la fecha y hora actuales, pero cuando lo hago, recibo la hora GMT, no teniendo en cuenta el horario de verano.

Esto es lo que dicen los documentos sobre el comando fecha

crea y devuelve una nueva fecha fijada para la fecha y la hora actuales.

¿Por qué Apple nos hace eso? ¿Por qué todo es tan complejo? ¿Es esto un error? ¿Hay alguna manera de obtener el tiempo real actual en el que se encuentra el dispositivo? al mismo tiempo que se muestra en el reloj del dispositivo?

Mi aplicación depende de las fechas y horas y tener una fecha incorrecta para un usuario ubicado en una zona horaria diferente en todo el mundo que está en verano o en invierno será un desastre.

Gracias.


EDITAR

Después de varias respuestas, he probado este código:

NSDate *wrongToday = [NSDate date]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
NSString *currentTime = [dateFormatter wrongToday]; 

NSDate *today = [dateFormatter dateFromString:currentTime]; 

adivinar lo que, hoy en día = wrongToday ... en otras palabras, ningún cambio, sigo teniendo la fecha incorrecta sin horario de verano. lo que es más sorprendente es que currentTime muestra en NSString la fecha con horario de verano ...

¿Alguna pista? gracias de nuevo.

+2

Los objetos NSDate representan un momento absoluto en el tiempo. No se ven afectados por el horario de verano o el horario de verano. Para generar una fecha en un huso horario específico, debe crear una instancia de NSDateFormatter. – albertamg

+1

lo siento, pero los documentos de Apple dicen que [NSDate date] devuelve la fecha y hora actuales y esto no es cierto. Una fecha y hora actual debe considerar el horario de verano. – SpaceDog

+2

La zona horaria y el horario de verano son problemas de localización. Los documentos mencionan GMT en varios lugares, pero ciertamente podrían ser más claros. – MRAB

Respuesta

2

Hay un par de buenas respuestas en el sitio ya here y here y here. Un NSDate es un intervalo desde la fecha de referencia (UTC), pero puede usar NSTimeZone como se detalla en esas respuestas.

+0

He editado la pregunta para incluir algún código ... por favor léelo. – SpaceDog

8

albertamg, MRAB y Joe Osborn son todos correctos. Todos intentan explicarte que NSDate es un "número", "un momento absoluto en el tiempo".

Este valor es INDEPENDIENTE de si se encuentra en Londres, en Los Ángeles o en Singapur. Es independiente de si su condado respeta el horario de verano.

A INTERPRET NSFecha en términos de algo reconocible (como "Th July 28, 4:28 pm"), necesita un NSDateFormatter. También debe asegurarse de que su configuración regional esté definida correctamente: incluida la zona horaria, si se respetan los ahorros de luz natural y varias convenciones de formato de fecha/hora.

'Espero que ayude ..

+0

He editado la pregunta para incluir algún código ... por favor léelo. – SpaceDog

4

codificación duro:

tiempo
BOOL isDayLightSavingTime = [sysTimezone isDaylightSavingTimeForDate:currentDate]; 
if (isDayLightSavingTime) { 
    NSTimeInterval timeInterval = [sysTimezone daylightSavingTimeOffsetForDate:currentDate]; 
    currentDate = [currentDate dateByAddingTimeInterval:timeInterval]; 
} 

la fecha actual ahora está Horario de verano.

Hope help.

3

¡Mi sugerencia!

NSString *dateToTest = @"16-10-2016"; // <-- daylight saving 
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; 

[dateformatter setDateFormat:@"dd-MM-yyyy"]; 

NSDate *data = [dateformatter dateFromString:dateToTest]; 

NSLog(@"data before --> %@:", data); 


if (data == nil && [[NSTimeZone systemTimeZone] isDaylightSavingTimeForDate:data]) { 

    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:[NSTimeZone localTimeZone].name]; 

    [dateformatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:[timeZone secondsFromGMT]]]; 

    data = [dateformatter dateFromString:dateToTest]; 

    NSLog(@"data after --> %@:", data); 
} 
Cuestiones relacionadas