2012-07-16 28 views
31

En mi aplicación de iPhone, tengo muchas dificultades para convertir el tiempo de respuesta del servicio web a la hora actual del dispositivo. El webservice time in UTC-5 timezone. La aplicación es una aplicación de uso mundial. Así que tengo que convertir el tiempo de respuesta a la zona horaria del dispositivo actual. Esta es una aplicación de mensajería simple.Obtener la fecha y hora de la zona horaria del dispositivo iPhone actual desde la aplicación UTC-5 de la zona horaria y la aplicación iPhone?

Cuando he enviado un message the time is "5:05 PM" (India Chennai timezone) pero cuando recibo el tiempo de webservice is "2012-07-16 07:33:01". Cuando muestro el tiempo en la aplicación, debo convertir la hora a la hora local del dispositivo. Lo he intentado de alguna manera, pero aún no puedo resolverlo. El código es:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter1 setLocale:[NSLocale currentLocale]]; 
//[dateFormatter1 setTimeZone:[NSTimeZone timeZoneWithName:@"IST"]]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr]; 
NSLog(@"date : %@",date); 

embargo, la fecha y la hora de salida es 2012-07-16 02:03:01 +0000 he guardado esta fecha/hora en Coredata y cuando tengo recuperar de CoreData y encubierta a NSString utilizando el código de abajo,

NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init]; 
[dateFormatters setDateFormat:@"dd-MMM-yyyy hh:mm"]; 
[dateFormatters setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatters setTimeStyle:NSDateFormatterShortStyle]; 
[dateFormatters setDoesRelativeDateFormatting:YES]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]]; 
dateStr = [dateFormatters stringFromDate:dateString]; 
NSLog(@"DateString : %@", dateStr); 

La fecha y hora de salida es "Today 7:33 AM". Debe mostrarse "Today 5:05 PM". ¿Puede alguien salvarme el día? Por favor ayuda a resolver este problema. Gracias por adelantado.

+2

veo un par de errores tipográficos que me preocupan, el MMM para el mes en el segundo bloque y la caja inconsistencia de horas entre los dos bloques – Eric

+0

@Eric Gracias. Pero, no puedo entender lo que estás diciendo? ¿Podría explicar por favor? Gracias. – Gopinath

+0

Publique la muestra exacta del formato de hora recibido de webcervice, deberá agregar el literal de zona horaria a la cadena de formato. –

Respuesta

74

He probado su situación y he agregado algunos códigos para su referencia. Por favor, prueba el siguiente y házmelo saber que es útil para ti.

NSString *dateStr = @"2012-07-16 07:33:01"; 
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr]; 
NSLog(@"date : %@",date); 

NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone]; 
NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 

NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date]; 
NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date]; 
NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset; 

NSDate *destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date] autorelease]; 

NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init]; 
[dateFormatters setDateFormat:@"dd-MMM-yyyy hh:mm"]; 
[dateFormatters setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatters setTimeStyle:NSDateFormatterShortStyle]; 
[dateFormatters setDoesRelativeDateFormatting:YES]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]];   
dateStr = [dateFormatters stringFromDate: destinationDate]; 
NSLog(@"DateString : %@", dateStr); 

Gracias.

+1

@Yuvaraj.M ¿Estaría dispuesto a agregar algunos comentarios a las tres líneas de cálculos de desplazamiento e intervalo? No estoy completamente siguiendo. –

+0

Awesome answer, @ yuvaraj –

+0

¿Estos cálculos también se ocupan de DST? Si no, entonces dime cómo puedo ocuparme del DST a tiempo. –

7
NSDate* currentDate = [NSDate date]; 

NSTimeZone* CurrentTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
NSTimeZone* SystemTimeZone = [NSTimeZone systemTimeZone]; 

NSInteger currentGMTOffset = [CurrentTimeZone secondsFromGMTForDate:currentDate]; 
NSInteger SystemGMTOffset = [SystemTimeZone secondsFromGMTForDate:currentDate]; 
NSTimeInterval interval = SystemGMTOffset - currentGMTOffset; 

NSDate* TodayDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:currentDate]; 
NSLog(@"Current time zone Today Date : %@", TodayDate); 

Swift 4

var currentDate = Date() 
var CurrentTimeZone = NSTimeZone(abbreviation: "GMT") 
var SystemTimeZone = NSTimeZone.system as NSTimeZone 
var currentGMTOffset: Int? = CurrentTimeZone?.secondsFromGMT(for: currentDate) 
var SystemGMTOffset: Int = SystemTimeZone.secondsFromGMT(for: currentDate) 
var interval = TimeInterval((SystemGMTOffset - currentGMTOffset!)) 
var TodayDate = Date(timeInterval: interval, since: currentDate) 
print("Current time zone Today Date : \(TodayDate)") 

espero que ayude a otros desarrolladores! Feliz Codificación!

+0

¿Pueden publicarlo en breve? – Chandni

+0

@Chandni - Que esto lo ayude - [UTC/GMT ⟺ Local] (https://stackoverflow.com/questions/11504843/get-current-iphone-device-timezone-date-and-time-from-utc-5 -timezone-date-and-ti/48867259 # 48867259) – Krunal

1

Que esta extensión sea más fácil.

Swift 4: UTC/GMT ⟺ local (Actual/Sistema)

extension Date { 

    // Convert local time to UTC (or GMT) 
    func toGlobalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

    // Convert UTC (or GMT) to local time 
    func toLocalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

} 


// Try it 
let utcDate = Date().toGlobalTime() 
let localDate = utcDate.toLocalTime() 

print("utcDate - (utcDate)") 
print("localDate - (localDate)") 
Cuestiones relacionadas