Bagaimana cara mengubah waktu dan zona waktu di simulator iPhone?

144

Bagaimana cara mengubah zona waktu dan waktu dalam simulator iPhone ?

Rahul Vyas
sumber
mengubah waktu dan tanggal Sistem bukanlah solusi. Itu berdampak pada semua aplikasi Mac termasuk cap waktu xcode. Perilaku yang benar adalah bahwa setiap perubahan lokasi Simulator harus mengubah waktu dan zona waktu. Semua hal lain hanya penyelesaian. Semoga Apple akan segera memperbaikinya
Rudi

Jawaban:

214

Saya menduga itu menggunakan zona waktu sistem Anda, jadi mengubah TZ di System Preferences mungkin akan melakukan trik

Tangkapan layar untuk deskripsi

nduplessis
sumber
1
Hmm ... Saya tidak punya opsi ini di simulator saya. Di ponsel saya ada di bawah Pengaturan -> Umum -> Tanggal & Waktu. Di simulator saya, bagian Tanggal & Waktu tidak ada.
Vito Andolini
6
Oh ... ubahlah dalam preferensi sistem mesin Anda, bukan pengaturan simulator. Baik. Itu berhasil!
Vito Andolini
2
satu masalah dalam hal ini, waktu Simulator diperbarui setelah 2 permen mengubah waktu sistem. metode apa pun yang mengubah waktu simulator secara bersamaan ....
AsifHabib
1
Saya mengubah waktu Mac dan waktu simulator tidak berubah, saya memeriksa apakah saya melakukan langkah yang benar, waktu simulator berubah. Jadi saya menyimpulkan bahwa waktu simulator diperbarui setelah 10 hingga 15 detik, tetapi itu tidak masalah bagi saya. @ JPK Saya tidak tahu masalah sistem Anda, cara terbaik adalah mencetak log waktu lengkap dan memeriksa di mana masalahnya.
AsifHabib
2
Ubah waktu sistem mac, lalu mulai ulang simulator Anda.
John Wong
41

Nyalakan kembali Simulator setelah mengubah preferensi waktu tanggal sistem dan Anda akan melihat perubahan tersebut tercermin. Ini berhasil untuk saya.

Vishal Shah
sumber
170
Solusi mengerikan (dari pihak Apple, bukan jawaban Anda). Ini persis seperti hal yang harus dapat dilakukan oleh simulator sebagai alternatif yang aman untuk benar-benar mengubah waktu sistem Anda dan berpotensi merusak barang-barang di komputer Anda.
devios1
3
@devios ini lebih benar dari sebelumnya dengan  Watch
lewis
@ Lewis42, apa maksudmu?
Iulian Onofrei
2
@ Lulian hanya ada perangkat baru untuk memberi tahu waktu, tetapi Anda masih harus dipusingkan seperti ini untuk menguji zona waktu. itu adalah komentar membuang, saya semakin frustrasi! :)
lewis
Sangat benar, @ Lewis42. Mengacaukan dengan waktu sistem pada ponsel Anda benar-benar mengacaukan hal-hal seperti data pergerakan di Apple Watch Anda. Membuat pengujian bermasalah, jika Anda peduli dengan data di jam tangan Anda.
James White
35

Akan bermanfaat jika Apple memberikan "tanggal Simulasikan" karena mereka menyediakan menu "Lokasi Simulasikan". Apa yang saya lakukan adalah menetapkan breakpoint segera setelah mendapatkan tanggal (menyimpannya dalam variabel) dan kemudian mengubah nilainya. Atau cukup modifikasi tempat di mana saya memeriksa perubahan tanggal dan membuatnya kembali benar.

Teknologi Levinson
sumber
Untuk menjadikan ini jawaban yang lebih baik: bagaimana Anda memodifikasinya? Anda menambahkan interval padanya? Bisakah Anda membagikan beberapa kode?
Sayang
Anda dapat melakukannya sekarang, di sini stackoverflow.com/a/62155632/2025766 Anda dapat menemukan cara melakukannya
Fede Henze
10

Untuk keperluan mengambil tangkapan layar, Apple akhirnya memungkinkan untuk mengganti waktu pada bilah status simulator iOS (sejak Xcode 11 ) dengan menggunakan alat simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
tadija
sumber
5
Saya pikir ini hanya mengesampingkan bilah status (untuk tujuan tangkapan layar). Tetapi itu tidak akan memengaruhi hasil API waktu / tanggal.
Roun
8

Berikut adalah solusi yang tersedia dari iOS 13 dan Xcode 11 setidaknya. (tidak menguji dengan versi sebelumnya)

Secara default, iOS Simulator menunjukkan waktu apa pun pada Mac Anda, Anda dapat menggunakan baris perintah Xcode untuk menimpanya dengan perintah ini di terminal:

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

Ganti nama simulator dengan perangkat yang ingin Anda ubah.

tangkapan layar waktu iPhone

Untuk bilah status Anda memiliki penggantian ini:

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.

Waktu dapat berupa string apa pun. Tetapi jika Anda ingin perangkat menampilkan tanggal, Anda perlu menggunakan format ISO . Misalnya string tanggal ISO yang valid adalah '2007-01-09T10: 41: 00 + 01: 00'

Kalau tidak, Anda dapat menggunakan parameter waktu sebagai string dan itu akan menampilkan apa pun yang Anda lewati.

Dengan terima kasih kepada posting asli oleh Paul Hudson Inilah tautannya !

banyak orang
sumber
1
Kemungkinan yang sangat bagus, tetapi tidak memungkinkan untuk benar-benar mengubah zona waktu untuk menguji fungsionalitas aplikasi di zona waktu yang berbeda. Saat menggunakan mis. Xcrun simctl status_bar "iPad Pro (11-inch)" timpa --waktu '2020-01-12T10: 41: 00-06: 00' ini mengubah waktu itu menjadi zona waktu CET saya saat ini dan menyetel waktu simulator iOS ke 5 : 41:00
kontrol acak
1
Untuk penjelasan: Saya ingin menguji bagaimana aplikasi saya bereaksi jika ada yang menggunakan zona waktu yang berbeda.
Kontrol acak
Anda benar, ini hanya mempengaruhi bilah status, saya hanya melakukan tes mencetak waktu saat ini di layar dan itu tidak mengubah waktu sistem perangkat yang disimulasikan hanya tampilan di atas. Saya mengedit posting saya untuk mencerminkan hal itu. Terima kasih
banyak
6

Anda dapat mengatur TZvariabel lingkungan dalam Skema Xcode untuk mengatur zona waktu hanya untuk aplikasi itu.

Kelola Skema

Anda dapat menggunakan UTC, PST, EST, serta nama-nama zona berbasis tempat seperti America/Los_Angeles. Ini tidak didokumentasikan dengan baik, tetapi saya curiga nama zona waktu mana pun bisa digunakan.

Ini tidak didokumentasikan dengan baik, tetapi sumbernya adalah perwakilan Dukungan Pengembang Apple di forum pengembang .

perampok
sumber
3
Mengapa ini turun memilih? Itu adalah satu-satunya hal yang bekerja untuk saya sebenarnya.
Jacob Rohde
1
Ini adalah solusi yang sangat bersih. Ini juga bagus jika Anda ingin menguji beberapa zona waktu yang berbeda: tambahkan pengaturan TZ untuk masing-masing zona, tetapi ingatlah untuk memilih hanya satu zona pada satu waktu. Saya baru saja menambahkan America / Chicago, Eropa / Istanbul, Asia / Hong_Kong, dan Pasifik / Honolulu untuk mendapatkan bermacam-macam sehingga saya dapat melacak bug yang bergantung pada zona waktu. Ini TIDAK akan berfungsi jika Anda perlu menangkap tangkapan layar atau bekerja dengan banyak aplikasi, tetapi ini adalah cara yang sangat cepat untuk beralih di antara beberapa zona waktu untuk menguji satu aplikasi.
Hal Mueller
5

Ketika mengubah zona waktu, saya menemukan cara termudah untuk melakukannya adalah dengan mengklik jam di menubar. Dan kemudian pilih "Open Date & Time Preferences" lalu pilih tab Time Zone.

Atau Preferensi Sistem -> Tanggal dan Waktu dan pilih tab Zona Waktu.

Hanya sebuah penunjuk untuk siapa saja yang mungkin tidak tahu jalan di OSX.

Lasse
sumber
6
Ini bukan jawaban, jadi itu harus komentar. Jumlah pengembang iOS yang tidak mengetahui jalannya di OS X adalah ... nol.
phatmann
5

Ini adalah utas lama tetapi yang terdekat dengan pertanyaan saya. Saya perlu mensimulasikan zona waktu untuk Eropa, metode ini berfungsi untuk saya. Buka ketuk 'Zona Waktu' alih-alih ketuk 'Tanggal & Waktu'. Hapus centang pada kotak 'Tetapkan zona waktu secara otomatis menggunakan lokasi saat ini' dan geser bilah persegi panjang vertikal (dengan titik biru di atasnya) untuk mensimulasikan waktu sistem Anda.

masukkan deskripsi gambar di sini

Astaga
sumber
2

Saya telah mengusulkan solusi otomatis untuk masalah mengubah waktu yang mencakup metode hacky swizzling: https://stackoverflow.com/a/34793193/829338 . Saya berasumsi bahwa itu juga harus bekerja untuk mengubah zona waktu.


Saya perlu menguji aplikasi saya secara otomatis, yang perlu mengubah waktu sistem. Saya lakukan, apa yang disarankan Tom: metode hacky bahagia berputar-putar.

Untuk tujuan demonstratif, saya hanya berubah [NSDate date]tetapi tidak [NSDate dateWithTimeIntervalSince1970:].

Pertama, kebutuhan Anda untuk membuat metode kelas yang berfungsi sebagai [tanggal NSDate] baru. Saya menerapkannya hanya untuk menggeser waktu dengan perbedaan waktu konstan.

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

Sejauh ini, cukup mudah. Sekarang tiba bagian menyenangkan. Kami mendapatkan metode dari kedua kelas dan implementasi pertukaran (itu bekerja untuk saya di AppDelegate, tetapi tidak di kelas UITests saya). Untuk ini, Anda perlu mengimpor 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
sumber
IIRC ini tidak akan berfungsi untuk menguji notifikasi lokal.
Steve Moser
1

Server build saya adalah UTC dan beberapa unit test saya membutuhkan zona waktu untuk menjadi PST. Menggunakan kategori di NSTimeZone Anda dapat mengesampingkan implementasi Apple untuk menggunakan kode Anda. Bekerja hanya untuk proyek cepat juga.

//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
sumpah
sumber
0

Setelah mengubah preferensi waktu tanggal sistem saya harus memilih Hardware> Reset All Content And Settings.
Hanya ini yang bekerja untuk saya di Versi 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Evgeny Karkan
sumber