İPhone simülatöründe zaman ve saat dilimi nasıl değiştirilir?


145

İPhone simülatöründeki saat ve saat dilimini nasıl değiştiririm ?


Sistem saatini ve tarihini değiştirmek bir çözüm değildir. Bu, xcode zaman damgaları dahil tüm Mac uygulamalarını etkiler. Doğru davranış, Simülatör konumundaki herhangi bir değişikliğin zaman ve saat dilimini değiştirmesi gerektiğidir. Diğer tüm şeyler sadece geçici çözümdür. Apple bu asap düzeltmek umut
Rudi

Yanıtlar:


214

Sistem saat diliminizi kullandığını tahmin ediyorum, bu yüzden Sistem Tercihlerinde TZ'yi değiştirmek muhtemelen işe yarayacaktır

Açıklama için ekran görüntüsü


1
Hmm ... Simülatörümde bu seçenek yok. Telefonumda Ayarlar -> Genel -> Tarih ve Saat altında. Simülatörümde Tarih ve Saat bölümü mevcut değil.
Vito Andolini

6
Oh ... simülatörün ayarlarında değil, makinenizin sistem tercihlerinde değiştirin. Sağ. İşe yaradı!
Vito Andolini

2
Buradaki bir problem, Simülatör zamanı, sistem zamanını değiştirdikten 2 dakika sonra güncellenir. simülatör zamanını aynı anda değiştiren herhangi bir yöntem ....
AsifHabib

1
Mac'in zamanını değiştirdim ve simülatör zamanı değişmedi, doğru adımları uyguladığımı kontrol ediyordum, simülatör zamanı değişti. Bu yüzden simülatör süresinin 10 ila 15 saniye sonra güncellendiği sonucuna vardım, ama bu benim için uygun. @JPK Sisteminizin problemini bilmiyorum, en iyi yol tüm zaman günlüklerini yazdırmak ve sorunun nerede olduğunu kontrol etmektir.
AsifHabib

2
Mac'in sistem saatini değiştirin, ardından simülatörünü yeniden başlatın.
John Wong

41

Sistem tarih saati tercihlerini değiştirdikten sonra Simülatörü yeniden başlatın ve değişikliklerin yansıtıldığını göreceksiniz. Benim için çalıştı.


172
Korkunç çözüm (Apple'ın cevabı değil, tarafında). Bu, simülatörün sistem zamanınızı gerçekten değiştirmeye ve bilgisayarınızdaki şeyleri kırmaya güvenli bir alternatif olarak yapması gereken şeydir.
devios1

3
@devios bu  Watch ile her zamankinden daha gerçek
lewis

@ Lewis42, ne demek istiyorsun?
Iulian Onofrei

2
@lulian, sadece zamanı söylemek için yeni bir cihaz olduğunu, ancak yine de zaman dilimlerini test etmek için bu gibi karışıklık yapmak zorundasınız. bir atmak yorum oldu, sinirli başlamıştı! :)
lewis

Çok doğru, @ Lewis42. Telefonunuzdaki sistem zamanı ile uğraşmak, Apple Watch'unuzdaki hareket verileri gibi şeyleri gerçekten berbat ediyor. Saatinizdeki verilerle ilgileniyorsanız testi sorunlu hale getirir.
James White

36

Apple, bir "Konumu Simüle Et" menüsü sağladığı için "Tarihi simüle et" seçeneği sunsaydı faydalı olacaktır. Ne yaptığım tarihi aldıktan sonra hemen bir kesme noktası ayarlamak (bir değişkene kaydetme) ve sonra değeri değiştirin. Ya da sadece bir tarih değişikliğini kontrol ettiğim ve değiştirdiğim noktayı değiştirin.


Bunu daha iyi bir cevap haline getirmek için: nasıl değiştirirsiniz? Buna bir aralık eklensin mi? Biraz kod paylaşabilir misiniz?
Honey

Şimdi bunu yapabilirsiniz, burada stackoverflow.com/a/62155632/2025766 nasıl yapılacağını bulabilirsiniz
Fede Henze

11

Ekran görüntüsü almak için Apple nihayet simctl aracını kullanarak iOS simülatörünün durum çubuğunda ( Xcode 11'den beri ) zamanı geçersiz kılmayı mümkün kıldı :

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

5
Bu sadece durum çubuğunu geçersiz kılar düşünüyorum (bir ekran görüntüsü amacıyla). Ancak bir saat / tarih API'sının sonucunu etkilemez.
17'de Roun

8

En azından iOS 13 ve Xcode 11'de bulunan bir çözüm. (önceki sürümlerle test etmedi)

Varsayılan olarak iOS Simulator, Mac'inizde saatin ne olduğunu gösterir, ancak Xcode'un komut satırını terminaldeki bu komutla geçersiz kılmak için kullanabilirsiniz:

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

Simülatör adını değiştirmek istediğiniz cihazla değiştirin.

iPhone zaman ekran görüntüsü

Durum çubuğu için bu geçersiz kılmalara sahipsiniz:

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.

Zaman herhangi bir dize olabilir. Ancak cihazın tarihi göstermesini istiyorsanız ISO formatını kullanmanız gerekir . Örneğin, geçerli bir ISO tarih dizesi '2007-01-09T10: 41: 00 + 01: 00'

Aksi takdirde, time parametresini bir dize olarak kullanabilirsiniz ve içine ne geçerseniz girin.

Paul Hudson tarafından orijinal yayına teşekkür grubu İşte bağlantı !


1
Çok güzel bir olasılık, ancak uygulama işlevselliğini farklı bir saat diliminde test etmek için zaman dilimini gerçekten değiştirmeye izin vermiyor. Örneğin xcrun simctl status_bar "iPad Pro (11 inç)" kullanıldığında --time '2020-01-12T10: 41: 00-06: 00' geçersiz kılma, o zamanı geçerli CET zaman dilimime dönüştürür ve iOS simülatör zamanını 5'e ayarlar : 41:00
randomcontrol

1
Açıklama için: Bir kullanımın farklı bir saat dilimine seyahat etmesi durumunda uygulamamın nasıl tepki verdiğini test etmek istiyorum.
randomcontrol

Haklısın, bu sadece durum çubuğunu etkiliyor, sadece ekranda geçerli saati yazdıran bir test yaptım ve simüle edilen cihazın sistem saatini sadece üstteki ekranı değiştirmedi. Gönderiyi bunu yansıtacak şekilde düzenledim. Teşekkürler
multitudes

6

Sen ayarlayabilirsiniz TZsadece bu uygulama için saat dilimini ayarlamak için bir Xcode Şemasında ortam değişkeni.

Şemaları Yönet

Sen kullanabilirsiniz UTC, PST, ESTyanı gibi yere dayalı saat dilimi adları gibi America/Los_Angeles. İyi belgelenmemiş, ancak herhangi bir saat dilimi adının çalışması gerektiğinden şüpheleniyorum .

İyi belgelenmemiş, ancak kaynak geliştirici forumlarında bir Apple Geliştirici Desteği temsilcisi .


3
Bu neden oylandı? Aslında benim için işe yarayan tek şey buydu.
Jacob Rohde

1
Bu gerçekten temiz bir çözüm. Birden fazla farklı saat dilimini test etmek istiyorsanız da harika: her biri için bir TZ ayarı ekleyin, ancak her seferinde yalnızca bir tane seçmeyi unutmayın. Zaman dilimine bağlı bir hatayı izleyebilmek için Amerika / Chicago, Avrupa / İstanbul, Asya / Hong_Kong ve Pasifik / Honolulu ekledim. Ekran görüntüsü almanız veya birden fazla uygulama ile çalışmanız gerekiyorsa bu çalışmaz, ancak tek bir uygulamayı test etmek için birden fazla zaman dilimi arasında geçiş yapmanın çok hızlı bir yoludur.
Hal Mueller

5

Saat dilimini değiştirirken, bunu yapmanın en kolay yolunun menü çubuğundaki saati tıklamak olduğunu buldum. Sonra "Tarih ve Saat Tercihlerini Aç" ı seçip Saat Dilimi sekmesini seçin.

Alternatif olarak Sistem Tercihleri ​​-> Tarih ve Saat öğelerini seçin ve Saat Dilimi sekmesini seçin.

Sadece OSX'te yolunu bilmeyen herkes için bir işaretçi.


6
Bu bir cevap değil, bu yüzden bir yorum olmalı. OS X'te yollarını bilmeyen iOS geliştiricilerinin sayısı sıfırdır.
phatmann

5

Bu eski bir konu ama soruma en yakın. Avrupa için saat dilimini simüle etmem gerekiyor, bu yöntem benim için çalışıyor. 'Tarih ve Saat' dokunun yerine 'Saat Dilimi' seçeneğine gidin. 'Geçerli konumu kullanarak saat dilimini otomatik olarak ayarla' kutusunun işaretini kaldırın ve sistem saatinizi simüle etmek için dikey dikdörtgen çubuğu (üzerinde mavi noktalı) kaydırın.

resim açıklamasını buraya girin


2

Keskin yöntem swizzling içeren zamanı değiştirme sorununa otomatik bir çözüm önerdim: https://stackoverflow.com/a/34793193/829338 . Bunun zaman dilimini buna göre değiştirmek için de işe yarayacağını düşünüyorum.


Uygulamamı otomatik olarak test etmem gerekiyordu, bu da sys zamanını değiştirmeyi gerektiriyordu. Tom'un önerdiği şeyi yaptım: mutlu hileli yöntem dolandırıcılığı.

Gösterici amaçlar için, sadece değişiyorum [NSDate date]ama değiştirmiyorum [NSDate dateWithTimeIntervalSince1970:].

Öncelikle, yeni [NSDate tarihi] olarak işlev gören sınıf yönteminizi yaratmanız gerekir. Sadece sabit bir timeDifference tarafından zaman kaydırmak için uyguladım.

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

Şimdiye kadar, oldukça kolay. Şimdi eğlenceli kısım geliyor. Yöntemleri hem sınıflardan hem de değişim uygulamasından alıyoruz (benim için AppDelegate'te çalıştı, ancak UITests sınıfımda değil). Bunun için içe aktarmanız gerekecek 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, yerel bildirimleri test etmek için çalışmaz.
Steve Moser

1

Yapım sunucum UTC ve bazı birim testlerimin saat dilimi PST olması gerekiyordu. NSTimeZone'da bir kategori kullanarak kodunuzu kullanmak için Apple'ın uygulamasını geçersiz kılabilirsiniz. Sadece hızlı projeler için de çalışır.

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

Sistem tarih saat tercihlerini değiştirdikten sonra Hardware> seçeneğini seçmek zorunda kaldım Reset All Content And Settings.
Sadece bu benim için Sürüm 10.3'te çalıştı (SimulatorApp-880.5 CoreSimulator-681.5.4).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.