reloj problema posicion porque poner pantalla hora formato fecha desconfigura como cambiar año atrasa apple iphone ios

iphone - problema - NSDate no devuelve mi zona horaria local/zona horaria predeterminada del dispositivo



porque se desconfigura la hora de mi iphone (7)

Mi zona horaria local y predeterminada es GMT +5, pero cuando recibo la fecha y hora de NSDate, me devuelve la fecha y la hora GMT.

Por ejemplo, el código y la salida de mi código mientras se prueba en el dispositivo es como, [zona horaria del dispositivo Islamabad GMT +5]

NSTimeZone *lo = [NSTimeZone localTimeZone]; NSLog(@" - current local timezone is %@",lo); // GMT +5 2010-12-28 20:56:11.785 Done[484:307] - current local timezone is Local Time Zone (Asia/Karachi (GMT+05:00) offset 18000) NSTimeZone *df = [NSTimeZone defaultTimeZone]; NSLog(@" - current default timezone is %@",df); // GMT +5 2010-12-28 20:56:11.790 Done[484:307] - current default timezone is Asia/Karachi (GMT+05:00) offset 18000

pero

NSDate *cDate = [NSDate date]; NSLog(@"current date by NSDate %@",cDate); //but NSDate show GMT 2010-12-28 20:56:11.794 Done[484:307] current date by NSDate 2010-12-28 15:56:11 GMT NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd''T''HH:mm"; //// NSTimeZone *gmt = [NSTimeZone ] NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT+05:00"]; [dateFormatter setTimeZone:gmt]; NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@" date string object %@" ,timeStamp); // string From Date is GMT +5 2010-12-28 20:56:11.802 Done[484:307] date string object 2010-12-28T20:56 NSDate *datef = [dateFormatter dateFromString:timeStamp]; NSLog(@" date object %@" ,datef); // the date form above string gives again GMT 2010-12-28 20:56:11.809 Done[484:307] **date object 2010-12-28 15:56:00 GMT**

¿Por qué NSDate no está dando la hora local actual? Por favor ayuda...


Eliseo Chavez Jr respuesta traducida a Swift

let sourceDate = NSDate(); let sourceTimeZone = NSTimeZone(abbreviation: "GMT")!; let destinationTimeZone = NSTimeZone.systemTimeZone(); let sourceGMTOffset: NSInteger = sourceTimeZone.secondsFromGMTForDate(sourceDate); let destinationGMTOffset:NSInteger = destinationTimeZone.secondsFromGMTForDate(sourceDate); let interval: NSTimeInterval = Double (destinationGMTOffset - sourceGMTOffset); let destinationDate = NSDate(timeInterval: interval, sinceDate: sourceDate);


Esto me funciona bien para obtener la fecha en mi zona horaria y formatearla como quiero:

NSDate* gmtDate = [NSDate date]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]]; [formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSString *dateString = [formatter stringFromDate:gmtDate];


NSDate es una fecha "cruda". Es por eso que está en GMT. Depende del código usar NSDateFormatter (como lo ha hecho) para dar salida a la fecha a un valor que tenga sentido para el usuario.

En algunos casos excepcionales, es posible que deba mostrar un NSDate que no utiliza la zona horaria de los usuarios (como si desea mostrar una hora en Nueva York independientemente de dónde se encuentre). Luego, establece el huso horario en el formateador de fecha en un valor específico (nuevamente, como lo ha hecho).

Es una práctica común para las computadoras almacenar todas las fechas en GMT, y luego ajustar la forma en que se muestran para el usuario. Si comienza a tratar de alterar cómo se almacena realmente la fecha, va a estropear muchos marcos de manejo de fechas que están asumiendo que su NSDate está en GMT.

Como ha visto, cuando lee una fecha mediante un NSDateFormatter, se convierte a partir de la hora ingresada en función de la zona horaria del formateador que ha establecido y luego se convierte a GMT. Entonces, ¿qué crees que está mal con lo que está haciendo? Porque está haciendo lo que debería: almacenar fechas en GMT y enviar cadenas basadas en una zona horaria.


Olvídate de NSDateFormatter es demasiado complicado, prueba esta magia:

NSLog(@"date with local timezone is: %@", [date descriptionWithLocale:[NSLocale systemLocale]]);


Prueba esto

- (NSDate *) GetLocalDate { NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; NSCalendar *theCalendar = [NSCalendar currentCalendar]; theCalendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; dayComponent = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; NSDate *localDate = [theCalendar dateFromComponents:dayComponent]; return localDate; }


Prueba esto...

NSDate* sourceDate = [NSDate date]; NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];

Esta ayuda responde a la zona horaria del sistema actual.


Si quieres la fecha y hora local. Pruebe este código: -

NSString *localDate = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];