swift date nsdate

swift - NSDate() o Date() muestra la hora incorrecta



(2)

NSDate (o Date in Swift ≥ V3) no tiene una zona horaria. Graba un instante en el tiempo en todo el mundo.

Internamente, los objetos de fecha registran el número de segundos desde la "fecha de la época", o la medianoche del 1 de enero de 2001 en Greenwich Mean Time , también conocido como UTC.

Normalmente pensamos en fechas en nuestra zona horaria local.

Si registra una fecha usando

print(NSDate())

El sistema muestra la fecha actual, pero la expresa en UTC / hora media de Greenwich. Entonces, el único lugar donde la hora se verá correcta es en esa zona horaria.

Obtiene el mismo problema en el depurador si emite el comando depurador

e NSDate()

Esto es un dolor Personalmente, deseo que iOS / Mac OS muestre las fechas usando la zona horaria actual del usuario, pero no lo hacen.

EDITAR # 2:

Una mejora en mi uso anterior de cadena localizada que hace que sea un poco más fácil de usar es crear una extensión para la clase Date :

extension Date { func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String { return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle) } }

De esa manera, puede usar una expresión como Date().localString() , o si solo desea imprimir la hora, puede usar Date().localString(dateStyle:.none)

EDITAR:

Acabo de descubrir que NSDateFormatter ( DateFormatter en Swift 3) tiene un método de clase localizedString. Eso hace lo que hace mi extensión a continuación, pero de manera más simple y limpia. Aquí está la declaración:

class func localizedString(from date: Date, dateStyle dstyle: DateFormatter.Style, timeStyle tstyle: DateFormatter.Style) -> String

Entonces simplemente usarías

let now = Date() print (DateFormatter.localizedString( from: now, dateStyle: .short, timeStyle: .short))

Puedes ignorar casi todo lo siguiente.

He creado una categoría de la clase NSDate (Fecha en swift 3) que tiene un método localDateString que muestra una fecha en la zona horaria local del usuario.

Aquí está la categoría en forma de Swift 3: (nombre de archivo Date_displayString.swift)

extension Date { @nonobjc static var localFormatter: DateFormatter = { let dateStringFormatter = DateFormatter() dateStringFormatter.dateStyle = .medium dateStringFormatter.timeStyle = .medium return dateStringFormatter }() func localDateString() -> String { return Date.localFormatter.string(from: self) } }

Y en forma Swift 2:

extension NSDate { @nonobjc static var localFormatter: NSDateFormatter = { let dateStringFormatter = NSDateFormatter() dateStringFormatter.dateStyle = .MediumStyle dateStringFormatter.timeStyle = .MediumStyle return dateStringFormatter }() public func localDateString() -> String { return NSDate.localFormatter.stringFromDate(self) } }

(Si prefiere un formato de fecha diferente, es bastante fácil modificar el formato utilizado por los formateadores de fecha. También es sencillo mostrar la fecha y la hora en cualquier zona horaria que necesite).

Sugeriría poner la versión apropiada de Swift 2 / Swift 3 de este archivo en todos sus proyectos.

Entonces puedes usar

Swift 2:

print(NSDate().localDateString())

Swift 3:

print(Date().localDateString())

Cuando intento registrar la fecha actual:

print(NSDate())

o

print(Date())

(en Swift 3)

O cualquier objeto de fecha, muestra la hora incorrecta. Por ejemplo, son alrededor de las 16:12 ahora, pero se muestra lo anterior

2016-10-08 20:11:40 +0000

¿Mi fecha está en la zona horaria incorrecta? ¿Cómo fijo mi fecha para tener la zona horaria correcta?

¿Por qué es eso y cómo lo soluciono? ¿Cómo visualizo fácilmente una fecha arbitraria en mi zona horaria local, ya sea en declaraciones impresas o en el depurador?

(Tenga en cuenta que esta pregunta es un "timbre" para que pueda proporcionarle una extensión simple Swift 3 / Swift 2 Date / NSDate que le permite mostrar fácilmente cualquier objeto de fecha en su zona horaria local.


Una manera simple de corregir la fecha para su zona horaria sería usar TimeZone.current.secondsFromGMT()

Algo así para un valor de marca de tiempo local, por ejemplo:

let currentLocalTimestamp = (Int(Date().timeIntervalSince1970) + TimeZone.current.secondsFromGMT())