Come modificare l'ora e il fuso orario nel simulatore di iPhone?


144

Come posso cambiare l'ora e il fuso orario nel simulatore iPhone ?


cambiare l'ora e la data del sistema non è una soluzione. Ciò influisce su tutte le applicazioni Mac, inclusi i timestamp xcode. Il comportamento corretto è che qualsiasi modifica della posizione del simulatore deve cambiare l'ora e il fuso orario. Tutte le altre cose sono solo soluzioni alternative. Spero che Apple risolva il problema al più presto
Rudi,

Risposte:


214

Immagino che usi il fuso orario del tuo sistema, quindi cambiare la TZ nelle Preferenze di Sistema probabilmente farebbe il trucco

Schermata per la descrizione


1
Hmm ... Non ho questa opzione sul mio simulatore. Sul mio telefono è in Impostazioni -> Generale -> Data e ora. Sul mio simulatore, la sezione Data e ora non esiste.
Vito Andolini,

6
Oh ... modificalo nelle preferenze di sistema della tua macchina, non nelle impostazioni del simulatore. Destra. Ha funzionato!
Vito Andolini,

2
un problema in questo, l'ora del simulatore viene aggiornata dopo 2 minuti di modifica dell'ora di sistema. qualsiasi metodo che modifica contemporaneamente il tempo del simulatore ....
AsifHabib

1
Ho cambiato il tempo del Mac e il tempo del simulatore non è cambiato, stavo controllando o ho fatto i passi giusti, il tempo del simulatore è cambiato. Quindi ho concluso che il tempo del simulatore viene aggiornato dopo 10-15 secondi, ma per me va bene. @JPK Non conosco il problema del tuo sistema, il modo migliore è stampare i registri orari completi e controllare dove si trova il problema.
AsifHabib,

2
Cambia l'ora di sistema del mac, quindi riavvia il simulatore.
John Wong,

41

Riavvia il simulatore dopo aver modificato le preferenze di data e ora del sistema e vedrai le modifiche riflesse. Ha funzionato per me.


170
Soluzione orribile (da parte di Apple, non la tua risposta). Questo è esattamente il tipo di cose che il simulatore dovrebbe essere in grado di fare come alternativa sicura alla modifica effettiva dell'ora del sistema e alla potenziale rottura del computer.
devios1

3
@devios questo è più vero che mai con  Watch
Lewis,

@ Lewis42, che vuoi dire?
Iulian Onofrei,

2
@lulian solo che c'è un nuovo dispositivo per dire l'ora, ma devi ancora fare casino in questo modo per testare i fusi orari. era un commento da buttare via, mi stavo frustrando! :)
Lewis,

Molto vero, @ Lewis42. Fare casino con l'ora del sistema sul telefono rovina davvero cose come i dati di movimento sul tuo Apple Watch. Rende problematico il test, se ti interessano i dati sul tuo orologio.
James White,

35

Sarebbe utile se Apple fornisse una "Data simulazione" in quanto forniva un menu "Simula posizione". Quello che faccio è impostare un punto di interruzione immediatamente dopo aver ottenuto la data (salvandola in una variabile) e quindi modificare il valore. O semplicemente modifica il punto in cui controllo la modifica della data e la restituisco vera.


Per rendere questa una risposta migliore: come la modifichi? Hai aggiunto un intervallo ad esso? Puoi condividere del codice?
Miele

Puoi farlo ora, qui stackoverflow.com/a/62155632/2025766 puoi trovare come farlo
Fede Henze,

10

Allo scopo di fare uno screenshot, Apple ha finalmente reso possibile la sostituzione del tempo sulla barra di stato del simulatore iOS (dal Xcode 11 ) usando lo strumento simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"

5
Penso che questo abbia solo la precedenza sulla barra di stato (ai fini di uno screenshot). Ma non influirà sul risultato di un'API di data / ora.
Roun,

8

Ecco una soluzione disponibile almeno da iOS 13 e Xcode 11. (non testato con le versioni precedenti)

Per impostazione predefinita, iOS Simulator mostra a che ora è il tuo Mac, tuttavia, puoi utilizzare la riga di comando di Xcode per sovrascriverla con questo comando nel terminale:

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

Sostituisci il nome del simulatore con il dispositivo che desideri modificare.

screenshot del tempo di iPhone

Per la barra di stato hai queste sostituzioni:

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.

Il tempo può essere qualsiasi stringa. Ma se vuoi che il dispositivo mostri la data dovrai usare il formato ISO . Ad esempio, una stringa di data ISO valida sarebbe "2007-01-09T10: 41: 00 + 01: 00"

Altrimenti puoi usare il parametro time come stringa e mostrerà tutto ciò che ci passi.

Grazie al post originale di Paul Hudson Ecco il link !


1
Molto bella possibilità, ma non consente di cambiare davvero il fuso orario per testare la funzionalità dell'app in un fuso orario diverso. Quando si utilizza ad esempio xcrun simctl status_bar "iPad Pro (11 pollici)" override --time '2020-01-12T10: 41: 00-06: 00' converte quel tempo nel mio fuso orario CET attuale e imposta il tempo del simulatore iOS su 5 : 41pm
randomcontrol

1
Per una spiegazione: vorrei testare come reagisce la mia app se un uso viaggia in un fuso orario diverso.
randomcontrol

Hai ragione, questo riguarda solo la barra di stato, ho appena fatto un test stampando l'ora corrente sullo schermo e non ha cambiato l'ora di sistema del dispositivo simulato solo il display in alto. Ho modificato il mio post per riflettere quello. Grazie
moltitudini

6

Puoi impostare la TZvariabile d'ambiente in uno schema Xcode per impostare il fuso orario solo per quell'app.

Gestisci schemi

È possibile utilizzare UTC, PST, EST, così come i nomi di fuso orario place-based, come America/Los_Angeles. Non è ben documentato, ma sospetto che qualsiasi nome di fuso orario dovrebbe funzionare.

Non è ben documentato, ma la fonte è un rappresentante del supporto per gli sviluppatori Apple sui forum degli sviluppatori .


3
Perché questo è votato in giù? È stata l'unica cosa che ha funzionato per me in realtà.
Jacob Rohde,

1
Questa è una soluzione davvero pulita. È fantastico anche se vuoi testare più fusi orari diversi: aggiungi un'impostazione TZ per ognuno, ma ricorda di selezionarne solo uno alla volta. Ho appena aggiunto America / Chicago, Europa / Istanbul, Asia / Hong Kong e Pacifico / Honolulu per ottenere un assortimento in modo da poter rintracciare un bug dipendente dal fuso orario. Questo NON funzionerà se devi catturare schermate o lavorare con più app, ma è un modo molto veloce per passare da più fusi orari per testare una singola app.
Hal Mueller

5

Quando ho cambiato il fuso orario, ho trovato il modo più semplice per farlo facendo clic sull'orologio nella barra dei menu. E quindi selezionando "Apri preferenze data e ora", quindi seleziona la scheda Fuso orario.

In alternativa Preferenze di Sistema -> Data e ora e selezionare la scheda Fuso orario.

Solo un puntatore per chiunque non sappia come muoversi su OSX.


6
Questa non è una risposta, quindi dovrebbe essere un commento. Il numero di sviluppatori iOS che non conoscono OS X è ... zero.
Phatmann,

5

Questo è un vecchio thread ma è il più vicino alla mia domanda. Devo simulare il fuso orario per l'Europa, questo metodo funziona per me. Vai a "TimeZone" tocca invece di "Data e ora". Deseleziona la casella "Imposta fuso orario automaticamente utilizzando la posizione corrente" e fai scorrere la barra rettangolare verticale (con il punto blu su di essa) per simulare l'ora del sistema.

inserisci qui la descrizione dell'immagine


2

Ho proposto una soluzione automatica al problema di modifica del tempo che include lo sfreccio del metodo hacky: https://stackoverflow.com/a/34793193/829338 . Presumo che dovrebbe funzionare anche per modificare il fuso orario di conseguenza.


Avevo bisogno di testare la mia app automaticamente, il che richiedeva una modifica del tempo di sistema. Ho fatto, quello che Tom ha suggerito: felice metodo hacky frizzante.

A scopo dimostrativo, cambio solo [NSDate date]ma non [NSDate dateWithTimeIntervalSince1970:].

Innanzitutto è necessario creare il metodo di classe che funge da nuova [data NSDate]. L'ho implementato per spostare semplicemente il tempo di una differenza di tempo costante.

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

Finora, abbastanza facile. Ora arriva la parte divertente. Otteniamo i metodi da entrambe le classi e scambiamo l'implementazione (ha funzionato per me in AppDelegate, ma non nella mia classe UITests). Per questo dovrai importare 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);

IIRC non funzionerà per testare le notifiche locali.
Steve Moser,

1

Il mio server di build è UTC e alcuni dei miei test di unità avevano bisogno che il fuso orario fosse PST. Utilizzando una categoria su NSTimeZone puoi sovrascrivere l'implementazione di Apple per utilizzare il tuo codice. Funziona anche per progetti rapidi.

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

0

Dopo aver modificato le preferenze di data e ora del sistema, ho dovuto scegliere Hardware> Reset All Content And Settings.
Solo questo ha funzionato per me nella versione 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.