¿Cómo cambiar la hora y la zona horaria en el simulador de iPhone?

144

¿Cómo cambio la hora y la zona horaria en el simulador de iPhone ?

Rahul Vyas
fuente
cambiar la hora y la fecha del sistema no es una solución. Eso afecta a todas las aplicaciones de Mac, incluidas las marcas de tiempo xcode. El comportamiento correcto es que cualquier cambio en la ubicación del simulador tiene que cambiar la hora y la zona horaria. Todas las demás cosas son solo una solución. Espero que Apple arregle esto lo antes posible
Rudi

Respuestas:

214

Supongo que usa la zona horaria de su sistema, por lo que cambiar la TZ en las Preferencias del Sistema probablemente sería el truco.

Captura de pantalla para la descripción

nduplessis
fuente
1
Hmm ... no tengo esta opción en mi simulador. En mi teléfono está en Configuración -> General -> Fecha y hora. En mi simulador, la sección Fecha y hora no existe.
Vito Andolini
66
Oh ... cámbielo en las preferencias del sistema de su máquina, no en la configuración del simulador. Correcto. ¡Eso funciono!
Vito Andolini
2
Un problema en esto, el tiempo del simulador se actualiza después de 2 minutos de cambiar el tiempo del sistema. cualquier método que cambie el tiempo del simulador simultáneamente ...
AsifHabib
1
Cambié la hora de Mac y la hora del simulador no cambió, estaba comprobando si hice los pasos correctos, la hora del simulador cambió. Así que concluí que el tiempo del simulador se actualiza después de 10 a 15 segundos, pero eso está bien para mí. @JPK No conozco el problema de su sistema, la mejor manera es imprimir los registros de tiempo completos y verificar dónde está el problema.
AsifHabib
2
Cambie la hora del sistema de mac, luego reinicie su simulador.
John Wong
41

Reinicie el simulador después de cambiar las preferencias de fecha y hora del sistema y verá reflejados los cambios. Funcionó para mi.

Vishal Shah
fuente
170
Solución horrible (por parte de Apple, no es su respuesta). Este es exactamente el tipo de cosas que el simulador debería ser capaz de hacer como una alternativa segura para cambiar realmente la hora de su sistema y potencialmente romper cosas en su computadora.
devios1
3
@devios esto es más cierto que nunca con  Watch
lewis
@ Lewis42, ¿qué quieres decir?
Iulian Onofrei
2
@lulian solo que hay un nuevo dispositivo para decir la hora, pero todavía tienes que jugar así para probar las zonas horarias. fue un comentario descartable, ¡me estaba frustrando! :)
Lewis
Muy cierto, @ Lewis42. Jugar con la hora del sistema en su teléfono realmente arruina cosas como los datos de movimiento en su Apple Watch. Hace que las pruebas sean problemáticas, si te importan los datos de tu reloj.
James White
35

Sería útil si Apple proporcionara una "Fecha de simulación" ya que proporcionaba un menú de "Simular ubicación". Lo que hago es establecer un punto de interrupción inmediatamente después de obtener la fecha (guardarlo en una variable) y luego modificar el valor. O simplemente modifique el lugar donde verifico un cambio de fecha y haga que regrese verdadero.

LevinsonTechnologies
fuente
Para hacer esto una mejor respuesta: ¿cómo lo modifica? ¿Le agregas un intervalo? ¿Puedes compartir algún código?
Miel
Puedes hacerlo ahora, aquí stackoverflow.com/a/62155632/2025766 puedes encontrar cómo hacerlo
Fede Henze
10

Con el fin de tomar una captura de pantalla, Apple finalmente hizo posible anular el tiempo en la barra de estado del simulador de iOS (desde Xcode 11 ) usando la herramienta simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
tadija
fuente
55
Creo que esto solo anula la barra de estado (para una captura de pantalla). Pero no afectará el resultado de una API de hora / fecha.
Roun
8

Aquí hay una solución disponible de iOS 13 y Xcode 11 al menos. (no probado con versiones anteriores)

De forma predeterminada, el simulador de iOS muestra el tiempo que esté en su Mac, sin embargo, puede usar la línea de comando de Xcode para anular eso con este comando en la terminal:

xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'

Reemplace el nombre del simulador con el dispositivo que desea cambiar.

captura de pantalla del tiempo de iPhone

Para la barra de estado, tiene esta anulación:

You may specify any combination of these flags (at least one is required):

--time <string>
     Set the date or time to a fixed value.
     If the string is a valid ISO date string it will also set the date on relevant devices.
--dataNetwork <dataNetworkType>
     If specified must be one of 'wifi', '3g', '4g', 'lte', 'lte-a', or 'lte+'.
--wifiMode <mode>
     If specified must be one of 'searching', 'failed', or 'active'.
--wifiBars <int>
     If specified must be 0-3.
--cellularMode <mode>
     If specified must be one of 'notSupported', 'searching', 'failed', or 'active'.
--cellularBars <int>
     If specified must be 0-4.
--batteryState <state>
     If specified must be one of 'charging', 'charged', or 'discharging'.
--batteryLevel <int>
     If specified must be 0-100.

El tiempo puede ser cualquier cadena. Pero si desea que el dispositivo muestre la fecha, deberá usar el formato ISO . Por ejemplo, una cadena de fecha ISO válida sería '2007-01-09T10: 41: 00 + 01: 00'

De lo contrario, puede usar el parámetro de tiempo como una cadena y mostrará lo que pase en él.

Gracias a la publicación original de Paul Hudson. ¡Aquí está el enlace !

multitudes
fuente
1
Muy buena posibilidad, pero no permite cambiar realmente la zona horaria para probar la funcionalidad de la aplicación en una zona horaria diferente. Cuando se utiliza, por ejemplo, xcrun simctl status_bar "iPad Pro (11 pulgadas)" anulación - time '2020-01-12T10: 41: 00-06: 00' convierte ese tiempo en mi zona horaria CET actual y establece el tiempo del simulador de iOS en 5 : 41pm
randomcontrol
1
Para explicación: me gustaría probar cómo reacciona mi aplicación si un uso viaja a una zona horaria diferente.
randomcontrol
Tiene razón, esto afecta solo a la barra de estado, acabo de hacer una prueba de impresión de la hora actual en la pantalla y no cambió la hora del sistema del dispositivo simulado solo la pantalla en la parte superior. Edité mi publicación para reflejar eso. Gracias
multitudes
6

Puede establecer la TZvariable de entorno en un Esquema Xcode para establecer la zona horaria solo para esa aplicación.

Gestionar esquemas

Se puede utilizar UTC, PST, EST, así como los nombres de zona horaria basados en el lugar, tales como America/Los_Angeles. No está bien documentado, pero sospecho que cualquier nombre de zona horaria debería funcionar.

No está bien documentado, pero la fuente es un representante de Apple Developer Support en los foros de desarrolladores .

ladrones
fuente
3
¿Por qué se vota esto abajo? Fue lo único que funcionó para mí en realidad.
Jacob Rohde
1
Esta es una solución realmente limpia. También es excelente si desea probar varias zonas horarias diferentes: agregue una configuración TZ para cada una, pero recuerde seleccionar solo una a la vez. Acabo de agregar América / Chicago, Europa / Estambul, Asia / Hong_Kong y Pacífico / Honolulu para obtener una variedad y poder localizar un error dependiente de la zona horaria. Esto NO funcionará si necesita capturar capturas de pantalla o trabajar con múltiples aplicaciones, pero es una forma muy rápida de cambiar entre varias zonas horarias para probar una sola aplicación.
Hal Mueller
5

Al cambiar la zona horaria, encontré que la forma más fácil de hacerlo era haciendo clic en el reloj de la barra de menú. Y luego seleccionando "Abrir preferencias de fecha y hora" y luego seleccione la pestaña Zona horaria.

Alternativamente, Preferencias del sistema -> Fecha y hora y seleccione la pestaña Zona horaria.

Solo un puntero para cualquiera que no conozca OSX.

Lasse
fuente
66
Esta no es una respuesta, por lo que debería ser un comentario. El número de desarrolladores de iOS que no conocen bien OS X es ... cero.
phatmann
5

Este es un hilo viejo pero está más cerca de mi pregunta. Necesito simular la zona horaria de Europa, este método funciona para mí. Vaya al toque 'TimeZone' en lugar del toque 'Fecha y hora'. Desmarque la casilla 'Establecer zona horaria automáticamente usando la ubicación actual' y deslice la barra de rectángulo vertical (con un punto azul) para simular la hora de su sistema.

ingrese la descripción de la imagen aquí

Oh mi
fuente
2

He propuesto una solución automática al problema de cambiar el tiempo que incluye el método hacky swizzling: https://stackoverflow.com/a/34793193/829338 . Supongo que eso también debería funcionar para cambiar la zona horaria en consecuencia.


Necesitaba probar mi aplicación automáticamente, lo que requería cambiar el tiempo del sistema. Lo hice, lo que Tom sugirió: feliz método hacky swizzling.

Con fines demostrativos, solo cambio [NSDate date]pero no [NSDate dateWithTimeIntervalSince1970:].

Primero, necesita crear su método de clase que sirva como la nueva [fecha NSDate]. Lo implementé para simplemente cambiar el tiempo por una diferencia de tiempo constante.

int timeDifference = 60*60*24; //shift by one day
NSDate* (* original)(Class,SEL) = nil;

+(NSDate*)date{
    NSDate* date = original([NSDate class], @selector(date));
    return [date dateByAddingTimeInterval:timeDifference];
}

Hasta ahora, bastante fácil. Ahora viene la parte divertida. Obtenemos los métodos de ambas clases y la implementación de intercambio (funcionó para mí en AppDelegate, pero no en mi clase UITests). Para esto necesitarás importar objc/runtime.h.

Method originalMethod = class_getClassMethod([NSDate class], @selector(date));
Method newMethod = class_getClassMethod([self class], @selector(date));

//save the implementation of NSDate to use it later
original  = (NSDate* (*)(Class,SEL)) [NSDate methodForSelector:@selector(date)];

//happy swapping
method_exchangeImplementations(originalMethod, newMethod);
Sebastian Hojas
fuente
IIRC esto no funcionará para probar notificaciones locales.
Steve Moser
1

Mi servidor de compilación es UTC y algunas de las pruebas de mi unidad necesitaban que la zona horaria fuera PST. Usando una categoría en NSTimeZone puede anular la implementación de Apple para usar su código. Funciona solo para proyectos rápidos.

//NSTimeZone+DefaultTimeZone.h
#import <Foundation/Foundation.h>

@interface NSTimeZone (DefaultTimeZone)

+(NSTimeZone *)defaultTimeZone;

@end

//NSTimeZone+DefaultTimeZone.m
#import "NSTimeZone+DefaultTimeZone.h"

@implementation NSTimeZone (DefaultTimeZone)

+(NSTimeZone *)defaultTimeZone
{
    return [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
}

@end
Odyth
fuente
0

Después de cambiar las preferencias de fecha y hora del sistema, tuve que elegir Hardware> Reset All Content And Settings.
Solo esto funcionó para mí en la versión 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Evgeny Karkan
fuente