2010-12-28 20 views
33

Mi zona horaria local y predeterminada es GMT +5, pero cuando obtengo la fecha y hora de NSDate, me devuelve la fecha y la hora GMT.NSDate no devuelve mi zona horaria local/zona horaria predeterminada del dispositivo

Por ejemplo, el código y la salida de mi código, mientras que las pruebas en el dispositivo es como, [zona horaria GMT dispositivo de Islamabad 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é no dar NSDate locales ¿tiempo actual? Por favor, ayuda ...

+0

Es hacer la codificación más simple . Como programador, siempre puedes asumir que el valor 'NSDate' está en GMT. De esta forma, solo tendrá que preocuparse por TimeZone cuando esté usando un 'NSDateFormatter' para mostrar la hora al usuario. – Tobias

Respuesta

8

NSDate es una fecha "sin procesar". 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 necesite mostrar un NSDate que no utiliza la zona horaria de los usuarios (como si desea mostrar una hora en Nueva York sin importar dónde se encuentre el usuario). 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 cómo 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 a través de 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.

70

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]; 

Esto ayuda responden a la zona horaria actual del sistema.

+6

No funciona con horario de verano –

+0

Gracias, justo lo que necesito –

+0

Esto debería funcionar perfectamente para mí :). Gracias. – Birju

22

Forget NSDateFormatter que es demasiado complicado, en lugar de tratar esta magia:

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

Si desea Fecha y hora local. Prueba este código: -

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

+1. Esto es lo que había averiguado y descubrí que ya estaba sugerido. Da una salida que se parece a: 2014-06-27 00:51:13 – asiby

1

Esto funciona bien para mí para obtener la fecha en mi zona horaria y el formato al igual que yo 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]; 
4

Prueba este

- (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; 
} 
2

Eliseo Respuesta de Chavez Jr 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); 
Cuestiones relacionadas