Comment changer l'heure et le fuseau horaire dans le simulateur iPhone?

145

Comment changer l'heure et le fuseau horaire dans le simulateur iPhone ?

Rahul Vyas
la source
pour changer l'heure et la date du système n'est pas une solution. Cela affecte toutes les applications Mac, y compris les horodatages xcode. Le comportement correct est que tout changement de l'emplacement du simulateur doit changer l'heure et le fuseau horaire. Toutes les autres choses ne sont qu'une solution de contournement. J'espère qu'Apple réglera ce problème dès que possible
Rudi

Réponses:

214

Je suppose qu'il utilise le fuseau horaire de votre système, donc changer le TZ dans les préférences système ferait probablement l'affaire

Capture d'écran pour la description

nduplessis
la source
1
Hmm ... Je n'ai pas cette option sur mon simulateur. Sur mon téléphone, il est sous Paramètres -> Général -> Date et heure. Sur mon simulateur, la section Date et heure n'existe pas.
Vito Andolini
6
Oh ... changez-le dans les préférences système de votre machine, pas dans les paramètres du simulateur. Droite. Ça a marché!
Vito Andolini
2
un problème dans cela, l'heure du simulateur est mise à jour après 2 minutes de changement de l'heure du système. toute méthode qui change l'heure du simulateur simultanément ....
AsifHabib
1
J'ai changé l'heure du Mac et l'heure du simulateur n'a pas changé, je vérifiais que je faisais les bonnes étapes, l'heure du simulateur a changé. J'ai donc conclu que le temps du simulateur était mis à jour après 10 à 15 secondes, mais cela me convient. @JPK Je ne connais pas le problème de votre système, le meilleur moyen est d'imprimer les journaux de temps complets et de vérifier où est le problème.
AsifHabib
2
Changez l'heure système du mac, puis redémarrez votre simulateur.
John Wong
41

Redémarrez le simulateur après avoir modifié les préférences de date et d'heure du système et vous verrez les changements reflétés. Cela a fonctionné pour moi.

Vishal Shah
la source
172
Solution horrible (de la part d'Apple, pas de votre réponse). C'est exactement le genre de chose que le simulateur devrait être capable de faire comme alternative sûre pour changer réellement l'heure de votre système et potentiellement casser des choses sur votre ordinateur.
devios1
3
@devios c'est plus vrai que jamais avec  Watch
lewis
@ Lewis42, que voulez-vous dire?
Iulian Onofrei
2
@lulian vient juste de dire qu'il y a un nouvel appareil pour indiquer l'heure, mais il faut encore déconner comme ça pour tester les fuseaux horaires. c'était un commentaire jetable, je devenais frustré! :)
lewis
Très vrai, @ Lewis42. Jouer avec l'heure système sur votre téléphone dérange vraiment des choses comme les données de mouvement sur votre Apple Watch. Rend les tests problématiques, si vous vous souciez des données de votre montre.
James White
36

Il serait utile qu'Apple fournisse une "Simuler la date" car ils fournissent un menu "Simuler l'emplacement". Ce que je fais est de définir un point d'arrêt immédiatement après avoir obtenu la date (en l'enregistrant dans une variable), puis de modifier la valeur. Ou modifiez simplement l'endroit où je vérifie un changement de date et faites-le revenir vrai.

LevinsonTechnologies
la source
Pour en faire une meilleure réponse: comment le modifier? Vous y ajoutez un intervalle? Pouvez-vous partager du code?
Honey
Vous pouvez le faire maintenant, ici stackoverflow.com/a/62155632/2025766 vous pouvez trouver comment le faire
Fede Henze
11

Dans le but de faire une capture d'écran, Apple a finalement permis de remplacer l'heure sur la barre d'état du simulateur iOS (depuis Xcode 11 ) en utilisant l' outil simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Tadija
la source
5
Je pense que cela ne remplace que la barre d'état (dans le but d'une capture d'écran). Mais cela n'affectera pas le résultat d'une API heure / date.
Roun
8

Voici une solution disponible depuis iOS 13 et Xcode 11 au moins. (n'a pas testé avec les versions précédentes)

Par défaut, le simulateur iOS montre quelle que soit l'heure sur votre Mac, cependant, vous pouvez utiliser la ligne de commande de Xcode pour remplacer cela avec cette commande dans le terminal:

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

Remplacez le nom du simulateur par le périphérique que vous souhaitez modifier.

capture d'écran de l'heure de l'iPhone

Pour la barre d'état, vous avez ces remplacements:

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.

L'heure peut être n'importe quelle chaîne. Mais si vous souhaitez que l'appareil affiche la date, vous devrez utiliser le format ISO . Par exemple, une chaîne de date ISO valide serait «2007-01-09T10: 41: 00 + 01: 00»

Sinon, vous pouvez utiliser le paramètre time comme une chaîne et il affichera tout ce que vous lui passez.

Merci à l'article original de Paul Hudson Voici le lien !

multitudes
la source
1
Très belle possibilité, mais ne permet pas vraiment de changer le fuseau horaire pour tester la fonctionnalité de l'application dans un fuseau horaire différent. Lorsque vous utilisez par exemple xcrun simctl status_bar «iPad Pro (11-inch)» override --time '2020-01-12T10: 41: 00-06: 00', il convertit cette heure en mon fuseau horaire CET actuel et définit l'heure du simulateur iOS sur 5 : 41pm
randomcontrol le
1
Pour explication: j'aimerais tester comment mon application réagit si une utilisation se déplace vers un fuseau horaire différent.
randomcontrol le
Vous avez raison, cela n'affecte que la barre d'état, je viens de faire un test d'impression de l'heure actuelle à l'écran et cela n'a pas changé l'heure système du périphérique simulé uniquement l'affichage en haut. J'ai modifié mon message pour refléter cela. Merci
multitudes
6

Vous pouvez définir la TZvariable d'environnement dans un schéma Xcode pour définir le fuseau horaire uniquement pour cette application.

Gérer les schémas

Vous pouvez utiliser UTC, PST, EST, ainsi que les noms des fuseaux horaires territorialisées tels que America/Los_Angeles. Ce n'est pas bien documenté, mais je soupçonne que tout nom de fuseau horaire devrait fonctionner.

Ce n'est pas bien documenté, mais la source est un représentant du support Apple Developer sur les forums des développeurs .

voleurs
la source
3
Pourquoi est-ce voté à la baisse? C'était la seule chose qui fonctionnait pour moi en fait.
Jacob Rohde le
1
C'est une solution vraiment propre. C'est également génial si vous souhaitez tester plusieurs fuseaux horaires différents: ajoutez un paramètre TZ pour chacun, mais n'oubliez pas de n'en sélectionner qu'un à la fois. Je viens d'ajouter America / Chicago, Europe / Istanbul, Asia / Hong_Kong et Pacific / Honolulu pour obtenir un assortiment afin que je puisse localiser un bogue dépendant du fuseau horaire. Cela ne fonctionnera PAS si vous devez capturer des captures d'écran ou travailler avec plusieurs applications, mais c'est un moyen très rapide de basculer entre plusieurs fuseaux horaires pour tester une seule application.
Hal Mueller
5

Lors du changement de fuseau horaire, j'ai trouvé le moyen le plus simple de le faire en cliquant sur l'horloge dans la barre de menus. Et puis en sélectionnant "Ouvrir les préférences de date et d'heure" puis sélectionnez l'onglet Fuseau horaire.

Alternativement Préférences système -> Date et heure et sélectionnez l'onglet Fuseau horaire.

Juste un pointeur pour tous ceux qui ne connaissent peut-être pas OSX.

Lasse
la source
6
Ce n'est pas une réponse, donc ça devrait être un commentaire. Le nombre de développeurs iOS qui ne connaissent pas OS X est ... nul.
phatmann
5

C'est un vieux fil mais il est le plus proche de ma question. J'ai besoin de simuler le fuseau horaire pour l'Europe, cette méthode fonctionne pour moi. Allez sur «TimeZone» au lieu de «Date et heure». Décochez la case «Définir automatiquement le fuseau horaire en utilisant l'emplacement actuel» et faites glisser la barre rectangulaire verticale (avec un point bleu dessus) pour simuler l'heure de votre système.

entrez la description de l'image ici

Oh mon
la source
2

J'ai proposé une solution automatique au problème du changement d'heure qui inclut le swizzling de la méthode hacky: https://stackoverflow.com/a/34793193/829338 . Je suppose que cela devrait également fonctionner pour changer le fuseau horaire en conséquence.


J'avais besoin de tester mon application automatiquement, ce qui nécessitait de changer l'heure du système. Je l'ai fait, ce que Tom a suggéré: une bonne méthode de piratage.

À des fins de démonstration, je change seulement [NSDate date]mais pas [NSDate dateWithTimeIntervalSince1970:].

Vous devez d'abord créer votre méthode de classe qui sert de nouvelle [date NSDate]. Je l'ai implémenté pour simplement décaler l'heure d'une différence de temps 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];
}

Jusqu'ici, assez facile. Vient maintenant la partie amusante. Nous obtenons les méthodes à la fois des classes et de l'implémentation d'échange (cela a fonctionné pour moi dans AppDelegate, mais pas dans ma classe UITests). Pour cela, vous devrez importer 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
la source
IIRC cela ne fonctionnera pas pour tester les notifications locales.
Steve Moser
1

Mon serveur de construction est UTC et certains de mes tests unitaires nécessitaient que le fuseau horaire soit PST. En utilisant une catégorie sur NSTimeZone, vous pouvez remplacer l'implémentation d'Apple pour utiliser votre code. Fonctionne également pour les projets rapides uniquement.

//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
la source
0

Après avoir changé les préférences de date et d'heure du système, j'ai dû choisir Hardware> Reset All Content And Settings.
Seul cela a fonctionné pour moi dans la version 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Evgeny Karkan
la source