Wie ändere ich Zeit und Zeitzone im iPhone Simulator?

143

Wie ändere ich Zeit und Zeitzone im iPhone- Simulator?

Rahul Vyas
quelle
Systemzeit und -datum zu ändern ist keine Lösung. Dies betrifft alle Mac-Anwendungen, einschließlich Xcode-Zeitstempel. Das richtige Verhalten ist, dass jede Änderung des Simulator-Standorts Zeit und Zeitzone ändern muss. Alle anderen Dinge sind nur eine Problemumgehung. Hoffe, dass Apple dies so
Rudi

Antworten:

214

Ich vermute, es verwendet Ihre Systemzeitzone, also würde das Ändern der TZ in den Systemeinstellungen wahrscheinlich den Trick tun

Screenshot zur Beschreibung

nduplessis
quelle
1
Hmm ... Ich habe diese Option nicht in meinem Simulator. Auf meinem Telefon befindet es sich unter Einstellungen -> Allgemein -> Datum und Uhrzeit. In meinem Simulator existiert der Abschnitt Datum & Uhrzeit nicht.
Vito Andolini
6
Oh ... ändern Sie es in den Systemeinstellungen Ihres Computers, nicht in den Einstellungen des Simulators. Richtig. Das hat funktioniert!
Vito Andolini
2
Ein Problem dabei ist, dass die Simulatorzeit nach 2 Minuten Änderung der Systemzeit aktualisiert wird. jede Methode, die die Simulatorzeit gleichzeitig ändert ....
AsifHabib
1
Ich habe die Zeit des Mac geändert und die Simulatorzeit hat sich nicht geändert. Ich habe überprüft, ob ich die richtigen Schritte ausgeführt habe. Die Simulatorzeit hat sich geändert. Ich kam zu dem Schluss, dass die Simulatorzeit nach 10 bis 15 Sekunden aktualisiert wird, aber das ist für mich in Ordnung. @JPK Ich kenne das Problem Ihres Systems nicht. Der beste Weg ist, die vollständigen Zeitprotokolle auszudrucken und zu überprüfen, wo das Problem liegt.
AsifHabib
2
Ändern Sie die Systemzeit des Mac und starten Sie den Simulator neu.
John Wong
41

Starten Sie den Simulator neu, nachdem Sie die Einstellungen für Systemdatum und -zeit geändert haben. Die Änderungen werden angezeigt. Es hat bei mir funktioniert.

Vishal Shah
quelle
170
Schreckliche Lösung (von Apple, nicht Ihre Antwort). Dies ist genau die Art von Dingen, die der Simulator als sichere Alternative zur tatsächlichen Änderung Ihrer Systemzeit und möglicherweise zum Ausfall von Problemen auf Ihrem Computer ausführen kann.
Devios1
3
@devios das ist wahrer als je zuvor mit  Watch
Lewis
@ Lewis42, was meinst du?
Iulian Onofrei
2
@lulian nur, dass es ein neues Gerät gibt, um die Zeit zu bestimmen, aber Sie müssen immer noch so herumspielen, um Zeitzonen zu testen. Es war ein wegwerfender Kommentar, ich wurde frustriert! :)
Lewis
Sehr wahr, @ Lewis42. Wenn Sie mit der Systemzeit Ihres Telefons herumspielen, werden Dinge wie Bewegungsdaten auf Ihrer Apple Watch wirklich durcheinander gebracht. Das Testen ist problematisch, wenn Sie sich für die Daten auf Ihrer Uhr interessieren.
James White
35

Es wäre nützlich, wenn Apple ein "Datum simulieren" und ein Menü "Ort simulieren" bereitstellen würde. Ich setze einen Haltepunkt unmittelbar nach dem Abrufen des Datums (Speichern in einer Variablen) und ändere dann den Wert. Oder ändern Sie einfach die Stelle, an der ich nach einer Datumsänderung suche, und lassen Sie sie als wahr zurückgeben.

LevinsonTechnologies
quelle
Um dies zu einer besseren Antwort zu machen: Wie ändern Sie es? Sie fügen ein Intervall hinzu? Können Sie Code teilen?
Honig
Sie können es jetzt tun, hier stackoverflow.com/a/62155632/2025766 finden Sie, wie es geht
Fede Henze
10

Um einen Screenshot zu machen, hat Apple es endlich möglich gemacht, die Zeit in der Statusleiste des iOS-Simulators (seit Xcode 11 ) mithilfe des simctl- Tools zu überschreiben :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Tadija
quelle
5
Ich denke, dies überschreibt nur die Statusleiste (zum Zweck eines Screenshots). Das Ergebnis einer Zeit- / Datums-API wird jedoch nicht beeinflusst.
Roun
7

Hier ist eine Lösung, die mindestens für iOS 13 und Xcode 11 verfügbar ist. (nicht mit früheren Versionen getestet)

Standardmäßig zeigt der iOS-Simulator die Uhrzeit auf Ihrem Mac an. Sie können jedoch die Befehlszeile von Xcode verwenden, um dies mit diesem Befehl im Terminal zu überschreiben:

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

Ersetzen Sie den Simulatornamen durch das Gerät, das Sie ändern möchten.

Screenshot der iPhone-Zeit

Für die Statusleiste haben Sie folgende Überschreibungen:

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.

Die Zeit kann eine beliebige Zeichenfolge sein. Wenn das Gerät jedoch das Datum anzeigen soll, müssen Sie das ISO-Format verwenden . Eine gültige ISO-Datumszeichenfolge wäre beispielsweise "2007-01-09T10: 41: 00 + 01: 00".

Andernfalls können Sie den Parameter time als Zeichenfolge verwenden und es wird angezeigt, was Sie darin übergeben.

Mit Dank an den Originalbeitrag von Paul Hudson Hier ist der Link !

Vielzahl
quelle
1
Sehr schöne Möglichkeit, erlaubt aber nicht wirklich das Ändern der Zeitzone zum Testen der App-Funktionalität in einer anderen Zeitzone. Bei Verwendung von z. B. xcrun simctl status_bar "iPad Pro (11 Zoll)" überschreiben --time '2020-01-12T10: 41: 00-06: 00' wird diese Zeit in meine aktuelle MEZ-Zeitzone konvertiert und die iOS-Simulatorzeit auf 5 gesetzt : 41 Uhr
Zufallskontrolle
1
Zur Erklärung: Ich möchte testen, wie meine App reagiert, wenn eine Nutzung in eine andere Zeitzone wechselt.
Zufallskontrolle
Sie haben Recht, dies betrifft nur die Statusleiste. Ich habe gerade einen Test durchgeführt, bei dem die aktuelle Uhrzeit auf dem Bildschirm ausgedruckt wurde, und die Systemzeit des simulierten Geräts wurde nicht geändert. Nur die Anzeige oben. Ich habe meinen Beitrag bearbeitet, um dies widerzuspiegeln. Danke
Menge
5

Beim Ändern der Zeitzone fand ich den einfachsten Weg, dies zu tun, indem ich auf die Uhr in der Menüleiste klickte. Wählen Sie dann "Open Date & Time Preferences" und öffnen Sie die Registerkarte Time Zone.

Alternativ Systemeinstellungen -> Datum und Uhrzeit und wählen Sie die Registerkarte Zeitzone.

Nur ein Hinweis für alle, die sich mit OSX nicht auskennen.

Lasse
quelle
6
Dies ist keine Antwort, daher sollte es ein Kommentar sein. Die Anzahl der iOS-Entwickler, die sich mit OS X nicht auskennen, ist ... Null.
Phatmann
5

Dies ist ein alter Thread, aber er kommt meiner Frage am nächsten. Ich muss die Zeitzone für Europa simulieren, diese Methode funktioniert für mich. Gehen Sie zu "TimeZone" anstelle von "Date & Time". Deaktivieren Sie das Kontrollkästchen "Zeitzone automatisch anhand des aktuellen Standorts festlegen" und schieben Sie die vertikale Rechteckleiste (mit dem blauen Punkt darauf), um Ihre Systemzeit zu simulieren.

Geben Sie hier die Bildbeschreibung ein

Oh mein
quelle
4

Sie können die TZUmgebungsvariable in einem Xcode-Schema festlegen, um die Zeitzone nur für diese App festzulegen.

Schemata verwalten

Sie können verwendet werden UTC, PST, ESTsowie ortsbezogene Zeitzone Namen wie America/Los_Angeles. Es ist nicht gut dokumentiert, aber ich vermute, dass jeder Zeitzonenname funktionieren sollte.

Es ist nicht gut dokumentiert, aber die Quelle ist ein Vertreter des Apple Developer Support in den Entwicklerforen .

Robmathers
quelle
2
Warum wird dies abgelehnt? Es war das einzige, was für mich tatsächlich funktionierte.
Jacob Rohde
Dies ist eine wirklich saubere Lösung. Es ist auch großartig, wenn Sie mehrere verschiedene Zeitzonen testen möchten: Fügen Sie für jede eine TZ-Einstellung hinzu, aber denken Sie daran, jeweils nur eine auszuwählen. Ich habe gerade Amerika / Chicago, Europa / Istanbul, Asien / Hong_Kong und Pazifik / Honolulu hinzugefügt, um ein Sortiment zu erhalten, mit dem ich einen zeitzonenabhängigen Fehler aufspüren kann. Dies funktioniert NICHT, wenn Sie Screenshots aufnehmen oder mit mehreren Apps arbeiten müssen. Es ist jedoch eine sehr schnelle Möglichkeit, zwischen mehreren Zeitzonen zu wechseln, um eine einzelne App zu testen.
Hal Mueller
2

Ich habe eine automatische Lösung für das Problem der Änderung der Zeit vorgeschlagen, die das Swizzling von Hacky-Methoden umfasst: https://stackoverflow.com/a/34793193/829338 . Ich gehe davon aus, dass dies auch funktionieren sollte, um die Zeitzone entsprechend zu ändern.


Ich musste meine App automatisch testen, was eine Änderung der Systemzeit erforderlich machte. Ich habe getan, was Tom vorgeschlagen hat: Happy Hacky Method Swizzling.

Zu Demonstrationszwecken ändere ich nur, [NSDate date]aber nicht [NSDate dateWithTimeIntervalSince1970:].

Zuerst müssen Sie Ihre Klassenmethode erstellen, die als neues [NSDate-Datum] dient. Ich habe es implementiert, um die Zeit einfach um einen konstanten Zeitunterschied zu verschieben.

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];
}

Bisher ziemlich einfach. Jetzt kommt der lustige Teil. Wir erhalten die Methoden aus beiden Klassen und der Exchange-Implementierung (es hat bei mir im AppDelegate funktioniert, aber nicht in meiner UITests-Klasse). Dazu müssen Sie importieren 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
quelle
IIRC funktioniert dies nicht zum Testen lokaler Benachrichtigungen.
Steve Moser
1

Mein Build-Server ist UTC und einige meiner Unit-Tests benötigten die Zeitzone PST. Mithilfe einer Kategorie in NSTimeZone können Sie die Implementierung von Apple überschreiben, um Ihren Code zu verwenden. Funktioniert auch nur für schnelle Projekte.

//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
quelle
0

Nachdem ich die Einstellungen für Systemdatum und -zeit geändert hatte, musste ich Hardware> wählen Reset All Content And Settings.
Nur das hat bei mir in Version 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4) funktioniert.

Evgeny Karkan
quelle