2009-09-29 20 views

Respuesta

-3
- (NSDate*) convertToUTC:(NSDate*)sourceDate 
{ 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 
    NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 

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

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease]; 
    return destinationDate; 
} 
+13

-1 mal en muchos niveles –

+2

-1 Este 'NSDate' a' conversión NSDate' es engañoso y basado en una idea equivocada de lo que un objeto 'NSDate' representa. – albertamg

+0

@Dave DeLong Estoy de acuerdo en que intentar convertir objetos 'NSDate' entre zonas horarias es una tontería y no entiendo por qué esta otra respuesta tiene tantos votos hacia arriba: http: //stackoverflow.com/questions/1081647/how-to-convert -time-to-the-timezone-of-the-iphone-device/1082179 # 1082179 – albertamg

0

NSDate almacena internamente la zona horaria - hay algunas funciones que puede llamar o pasar en una zona horaria de destino si se quiere jsut una cadena que representa la fecha, ve apple's documentation

8

Si es para fines de visualización que desea mostrar, utilice NSDateFormatter así:

NSDate *myDate = [NSDate date]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 

// Set date style: 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

NSString *GMTDateString = [dateFormatter stringFromDate: myDate]; 
+0

¿qué sucede si el dispositivo tiene una demora de 2 horas. En ese caso, este cálculo es correcto? –

+0

¿Cómo sabría si el dispositivo tiene 2 horas de retraso? Solo puede trabajar con lo que le dan y debe confiar en que el sistema sea el correcto en todos los casos. Este es el trabajo del sistema, no su aplicación. –

+0

tenemos que considerar todos los escenarios, mi escenario es que quiero obtener el tiempo gmt independiente del tiempo del dispositivo. . . ¿Hay alguna otra forma de lograr esto? –

9

Esta es una versión más simple de la respuesta de Ramin

+ (NSDate *) GMTNow 
{ 
NSDate *sourceDate = [NSDate date]; 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 
    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT]; 

    [sourceDate addTimeInterval:currentGMTOffset]; 

    return sourceDate; 
} 
+1

Esto está mal sin embargo. Si estoy en NY, currentGMOffset será -14400. Como GMT es posterior a NYC, quiero agregar un valor positivo a sourceDate. También sourceDate no se ha modificado aquí. Necesita sourceDate = [sourceDate addTimeInterval: currentGMTOffset * -1]; que invierte el signo de la compensación. – ransomweaver

+0

¿Qué sucede si el dispositivo tiene una demora de 2 horas? En ese caso, ¿este cálculo es correcto? –

2
+ (NSDate*) convertToGMT:(NSDate*)sourceDate 
{ 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 

    NSTimeInterval gmtInterval = [currentTimeZone secondsFromGMTForDate:sourceDate]; 

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease];  
    return destinationDate; 
} 
+1

Este es en realidad un muy buen método de utilidad. Lo usaré en mi proyecto actual. Sin embargo, realmente no responde la pregunta. La pregunta era "¿Cómo obtengo la hora GMT?" –

4

Si la realización de los cálculos de fecha, estas categorías pueden sé útil. Después de haber convertido su fecha a 'normalizada' (es decir, con el mismo mes, día y año, pero a +1200 UTC), si luego realiza cálculos posteriores usando un NSCalendar que también está configurado en UTC (+[NSCalendar normalizedCalendar]), es ' Todo funcionará.

@implementation NSDate (NormalizedAdditions) 

+ (NSDate *)normalizedDateFromDateInCurrentCalendar:(NSDate *)inDate 
{ 
    NSDateComponents *todayComponents = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                     fromDate:inDate]; 
    [todayComponents setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    [todayComponents setHour:12]; 

    return [[NSCalendar normalizedCalendar] dateFromComponents:todayComponents]; 
} 

+ (NSDate *)normalizedDate 
{ 
    return [self normalizedDateFromDateInCurrentCalendar:[NSDate date]]; 
} 

@end 

@implementation NSCalendar (NormalizedAdditions) 

+ (NSCalendar *)normalizedCalendar 
{ 
    static NSCalendar *gregorian = nil; 
    if (!gregorian) { 
     gregorian = [[NSCalendar alloc] 
        initWithCalendarIdentifier:NSGregorianCalendar]; 
     [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    } 
    return gregorian; 
} 

@end 
Cuestiones relacionadas