ios - NSDate-Convertir fecha a GMT
objective-c swift (6)
Necesito la capacidad de convertir un valor NSDate
a una fecha GMT.
¿Cómo puedo convertir un valor NSDate
a un valor NSDate
formato GMT, independientemente de la configuración regional de la fecha que esté usando el dispositivo iPhone?
¿Has intentado consultar la documentación de NSDateFormatter?
NSDateFormatter parece tener algunos métodos para jugar con TimeZones, particularmente
-setTimeZone:
No lo he probado, pero me imagino que si establece GMT como zona horaria en una fecha que se representa originalmente en otra zona horaria, mostrará la fecha con los ajustes correctos para que coincida con la nueva zona horaria.
Si bien la respuesta de Alex fue un buen comienzo, no trató con el horario de verano (horario de verano) y agregó una conversión innecesaria a / desde la fecha de referencia. Los siguientes trabajos para mí:
Para convertir de un localDate a GMT, teniendo en cuenta el horario de verano:
NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!
Para convertir una fecha GMT a una fecha local, teniendo en cuenta el horario de verano:
NSDate *gmtDate = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];
Una pequeña nota: utilicé dateByAddingTimeInterval, que es solo para iOS 4. Si está en OS 3 o anterior, use addTimerInterval.
Trabajar con el tiempo en Cocoa puede ser complicado. Cuando obtienes un objeto NSDate
, está en la zona horaria local. [[NSTimeZone defaultTimeZone] secondsFromGMT]
le brinda el desplazamiento de la zona horaria actual desde GMT. Entonces puedes hacer esto:
NSDate *localDate = // get the date
NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];
Ahora gmtDate
debe tener la fecha correcta en GMT para ti. Para mostrarlo, mire NSDateFormatter
, específicamente los métodos setDateStyle
y setTimeStyle
. Crea un NSDateFormatter
, configúrelo de la manera que desee y luego llame a stringFromDate:
para obtener una cadena con un formato agradable.
La respuesta de Howard es correcta y por favor vote y acéptelo.
Para referencia, creo que es útil explicar la diferencia entre los objetos de fecha y las representaciones de fecha localizadas.
En muchos lenguajes de programación, los objetos de fecha se utilizan para representar puntos únicos en el tiempo. Al ignorar los argumentos Relativistic se puede suponer que en cualquier caso podemos definir un punto en el tiempo que es igual universalmente para cada uno, independientemente de cómo medimos el tiempo.
Si para cada punto en el tiempo pudiéramos construir una etiqueta única, esa etiqueta podría pasarse y referenciarse de forma inequívoca. El propósito de los objetos de fecha es actuar como una etiqueta universal única para un punto determinado en el tiempo .
Uno podría proponer cualquier número de técnicas para construir dicho esquema de etiquetado y cómo cada objeto de fecha elige hacerlo es irrelevante para cualquiera que lo use.
Un ejemplo puede ser usar un desplazamiento numérico de un evento universal ( X segundos desde que el sol explotó ).
Es solo cuando deseamos tomar un punto de tiempo y serializarlo en una cadena legible por humanos que debemos lidiar con las complejidades de las zonas horarias, locales, etc.
( Cadena de fecha local ) + ( Formateador de fecha ) => Punto de tiempo
Punto temporal + ( Formateador de fecha ) => ( Cadena de fecha local )
Cada punto de tiempo es universal ... no existe el punto de hora de nueva york o el punto de hora gmt , solo una vez que convierta un punto de tiempo en una cadena local (con un formateador de fecha) aparecerá una asociación a una zona horaria .
Nota: estoy seguro de que hay muchos blogs / artículos sobre este tema, pero mi google foo me está fallando a estas horas. Si alguien tiene el entusiasmo de ampliar este tema, siéntase libre de hacerlo.
Swift 4 :
//UTC or GMT ⟺ Local
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)
}
}
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd''T''HH:mm";
NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[dateFormatter setTimeZone:gmt];
NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
[dateFormatter release];