Como mudar a hora e o fuso horário no simulador do iPhone?

143

Como altero a hora e o fuso horário no simulador do iPhone ?

Rahul Vyas
fonte
alterar a hora e a data do sistema não é solução. Isso afeta todos os aplicativos Mac, incluindo carimbos de data e hora xcode. O comportamento correto é que qualquer alteração no local do Simulador deve alterar a hora e o fuso horário. Todas as outras coisas são apenas uma solução alternativa. Esperança de que a Apple vai corrigir isso o mais cedo possível
Rudi

Respostas:

214

Acho que ele usa o fuso horário do sistema, portanto, alterar a TZ nas Preferências do Sistema provavelmente faria o truque

Screenshot para descrição

nduplessis
fonte
1
Hmm ... eu não tenho essa opção no meu simulador. No meu telefone, está em Configurações -> Geral -> Data e hora. No meu simulador, a seção Data e hora não existe.
Vito Andolini
6
Ah ... altere-o nas preferências do sistema da sua máquina, não nas configurações do simulador. Certo. Isso funcionou!
Vito Andolini
2
um problema nisso, o tempo do simulador é atualizado após 2 minutos de alteração da hora do sistema. qualquer método que muda o tempo simulador simultaneamente ....
AsifHabib
1
Mudei o horário do Mac e o tempo do simulador não mudou, eu estava verificando ou fiz as etapas certas, o tempo do simulador mudou. Concluí que o tempo do simulador é atualizado após 10 a 15 segundos, mas tudo bem para mim. @JPK Eu não sei o problema do seu sistema, a melhor maneira é imprimir os registros de tempo completos e verificar onde está o problema.
AsifHabib
2
Altere a hora do sistema do mac e reinicie o simulador.
John Wong
41

Reinicie o Simulador depois de alterar as preferências de data e hora do sistema e você verá as alterações refletidas. Funcionou para mim.

Vishal Shah
fonte
170
Solução horrível (da parte da Apple, não sua resposta). Esse é exatamente o tipo de coisa que o simulador deve ser capaz de fazer como uma alternativa segura para realmente mudar a hora do sistema e potencialmente quebrar as coisas no seu computador.
devios1
3
@devios isso é mais verdadeiro do que nunca com  Assista
lewis
@ Lewis42, o que você quer dizer?
Iulian Onofrei 15/04
2
@ululian: existe um novo dispositivo para saber as horas, mas você ainda precisa mexer assim para testar os fusos horários. foi um comentário fora de jogo, eu estava ficando frustrado! :)
lewis
Muito verdade, @ Lewis42. Brincar com a hora do sistema no seu telefone realmente estraga tudo, como dados de movimento no seu Apple Watch. Torna o teste problemático, se você se importa com os dados do seu relógio.
James White
35

Seria útil se a Apple fornecesse uma "Data de simulação", pois eles forneciam um menu "Simular local". O que faço é definir um ponto de interrupção imediatamente após obter a data (salvando-a em uma variável) e depois modificar o valor. Ou apenas modifique o local em que verifico uma alteração de data e a faço retornar.

LevinsonTechnologies
fonte
Para fazer desta uma resposta melhor: como você a modifica? Você adiciona um intervalo a ele? Você pode compartilhar algum código?
Mel
Você pode fazer isso agora, aqui, stackoverflow.com/a/62155632/2025766, você pode encontrar como fazer isso
Fede Henze
10

Com o objetivo de tirar uma captura de tela, a Apple finalmente tornou possível substituir o tempo na barra de status do simulador iOS (desde o Xcode 11 ) usando a ferramenta simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
tadija
fonte
5
Eu acho que isso apenas substitui a barra de status (com a finalidade de uma captura de tela). Mas isso não afetará o resultado de uma API de hora / data.
Roun
8

Aqui está uma solução disponível no iOS 13 e Xcode 11, pelo menos. (não testou com versões anteriores)

Por padrão, o iOS Simulator mostra a qualquer hora no seu Mac; no entanto, você pode usar a linha de comando do Xcode para substituí-la por este comando no terminal:

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

Substitua o nome do simulador pelo dispositivo que você deseja alterar.

captura de tela do tempo do iPhone

Para a barra de status, você tem essas substituições:

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.

O horário pode ser qualquer sequência. Mas se você quiser que o dispositivo mostre a data, precisará usar o formato ISO . Por exemplo, uma sequência de datas ISO válida seria '2007-01-09T10: 41: 00 + 01: 00'

Caso contrário, você pode usar o parâmetro time como uma string e ele exibirá o que você passar nele.

Com agradecimentos ao post original de Paul Hudson Aqui está o link !

multidões
fonte
1
Possibilidade muito boa, mas não permite realmente alterar o fuso horário para testar a funcionalidade do aplicativo em um fuso horário diferente. Ao usar, por exemplo, substituição xcrun simctl status_bar "iPad Pro (11 polegadas)" --time '2020-01-12T10: 41: 00-06: 00', ele converte esse tempo no meu fuso horário atual da CET e define o tempo do simulador iOS para 5 : 41pm
randomcontrol
1
Para explicação: eu gostaria de testar como meu aplicativo reage se um uso for para um fuso horário diferente.
randomcontrol 12/01
Você está certo, isso afeta apenas a barra de status. Acabei de fazer um teste para imprimir a hora atual na tela e não alterou a hora do sistema do dispositivo simulado, apenas a exibição na parte superior. Eu editei minha postagem para refletir isso. Obrigado
multidões
5

Ao alterar o fuso horário, achei a maneira mais fácil de fazer isso clicando no relógio na barra de menus. E, em seguida, selecione "Abrir preferências de data e hora" e selecione a guia Fuso horário.

Como alternativa, Preferências do sistema -> Data e hora e selecione a guia Fuso horário.

Apenas um ponteiro para quem não conhece o OSX.

Lasse
fonte
6
Esta não é uma resposta, portanto deve ser um comentário. O número de desenvolvedores do iOS que não conhecem o OS X é ... zero.
Phatmann
5

Este é um tópico antigo, mas é o mais próximo da minha pergunta. Eu preciso simular o fuso horário na Europa, esse método funciona para mim. Vá para o toque em 'Fuso horário' em vez do toque em 'Data e hora'. Desmarque a caixa 'Definir fuso horário automaticamente usando o local atual' e deslize a barra retangular vertical (com um ponto azul) para simular a hora do sistema.

insira a descrição da imagem aqui

Oh meu
fonte
5

Você pode definir a TZvariável de ambiente em um esquema Xcode para definir o fuso horário apenas para esse aplicativo.

Gerenciar esquemas

Você pode usar UTC, PST, EST, bem como nomes de fuso horário de base local, tais como America/Los_Angeles. Não está bem documentado, mas suspeito que qualquer nome de fuso horário deva funcionar.

Não está bem documentado, mas a fonte é um representante de suporte ao desenvolvedor da Apple nos fóruns de desenvolvedores .

robmathers
fonte
2
Por que isso foi votado? Foi a única coisa que funcionou para mim, na verdade.
Jacob Rohde
Esta é uma solução realmente limpa. Também é ótimo se você quiser testar vários fusos horários diferentes: adicione uma configuração de TZ para cada um, mas lembre-se de selecionar apenas um de cada vez. Acabei de adicionar América / Chicago, Europa / Istambul, Ásia / Hong_Kong e Pacífico / Honolulu para obter uma variedade, para que eu possa rastrear um bug dependente do fuso horário. Isso NÃO funcionará se você precisar capturar capturas de tela ou trabalhar com vários aplicativos, mas é uma maneira muito rápida de alternar entre vários fusos horários para testar um único aplicativo.
Hal Mueller
2

Propus uma solução automática para o problema de alterar o tempo que inclui o swizzling do método hacky: https://stackoverflow.com/a/34793193/829338 . Suponho que também funcione para alterar o fuso horário de acordo.


Eu precisava testar meu aplicativo automaticamente, o que exigia a alteração do horário do sistema. Eu fiz, o que Tom sugeriu: método hacky feliz swizzling.

Para fins demonstrativos, apenas mudo, [NSDate date]mas não [NSDate dateWithTimeIntervalSince1970:].

Primeiro, você precisa criar seu método de classe que serve como a nova [data do NSDate]. Eu o implementei para simplesmente mudar o tempo por uma constante diferença de tempo.

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

Até agora, muito fácil. Agora vem a parte divertida. Obtemos os métodos das duas classes e da implementação do Exchange (funcionou para mim no AppDelegate, mas não na minha classe UITests). Para isso, você precisará 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
fonte
IIRC, isso não funcionará para testar as notificações locais.
21817 Steve Moser
1

Meu servidor de compilação é UTC e alguns dos meus testes de unidade precisavam que o fuso horário fosse PST. Usando uma categoria no NSTimeZone, você pode substituir a implementação da Apple para usar seu código. Também funciona para projetos rápidos também.

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

Depois de alterar as preferências de data e hora do sistema, tive que escolher Hardware> Reset All Content And Settings.
Somente isso funcionou para mim na versão 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Evgeny Karkan
fonte