iPhoneシミュレータで時間とタイムゾーンを変更する方法


143

iPhoneシミュレータで時間とタイムゾーンを変更するにはどうすればよいですか?


システムの時刻と日付を変更することは解決策ではありません。これは、xcodeタイムスタンプを含むすべてのMacアプリケーションに影響します。正しい動作は、シミュレータの場所を変更すると、時間とタイムゾーンが変更されることです。他のすべてのものは回避策です。Appleがこの問題をできるだけ早く修正することを願っています
Rudi

回答:


214

私はあなたのシステムのタイムゾーンを使用していると思いますので、システム環境設定でTZを変更するとおそらくうまくいくでしょう

説明のスクリーンショット


1
うーん...シミュレータにはこのオプションはありません。私の電話では、[設定]-> [一般]-> [日付と時刻]にあります。私のシミュレーターには、日付と時刻のセクションがありません。
Vito Andolini

6
ああ...シミュレータの設定ではなく、マシンのシステム設定で変更してください。正しい。うまくいきました!
Vito Andolini

2
この問題の1つは、システム時刻を変更してから2分後にシミュレーター時刻が更新されることです。シミュレータの時間を同時に変更する任意のメソッド...
AsifHabib

1
私はMacの時間を変更しましたが、シミュレーター時間は変更されませんでした。正しいステップを実行したか、シミュレーター時間が変更されたかを確認していました。したがって、シミュレータの時間は10〜15秒後に更新されると結論付けましたが、それでも問題ありません。@JPK私はあなたのシステムの問題を知りません、最良の方法は完全な時間ログを印刷してどこに問題があるかチェックすることです。
AsifHabib 2013年

2
Macのシステム時間を変更し、シミュレータを再起動します。
John Wong、

41

システムの日付時刻設定を変更した後、シミュレータを再起動すると、変更が反映されます。それは私のために働いた。


170
恐ろしい解決策(あなたの答えではなく、Appleの側)。これは、システム時刻を実際に変更し、コンピューター上のものを破壊する可能性のある安全な代替手段として、シミュレーターができることとまったく同じです。
devios1 2013

3
@devios thisウォッチでこれまで以上に真実
ルイス

@ Lewis42、どういう意味?
Iulian Onofrei 2015

2
@lulianは、時間を知らせるための新しいデバイスがあることを示していますが、タイムゾーンをテストするには、このようにいじくる必要があります。それは捨てられたコメントでした、私は欲求不満になりました!:)
ルイス

@ Lewis42のとおりです。スマートフォンのシステム時刻をいじくり回すと、Apple Watchの動きのデータなどが台無しになってしまいます。時計のデータを気にすると、テストに問題が生じます。
James White、

35

Appleが「Simulate Location」メニューを提供したので、「Simulate date」を提供した場合、それは役に立ちます。日付を取得した直後にブレークポイントを設定し(変数に保存)、値を変更します。または、日付の変更をチェックする場所を変更して、trueを返すようにします。


これをより良い答えにするために、どのように変更しますか?あなたはそれに間隔を追加しますか?いくつかのコードを共有できますか?
Honey

今すぐ実行できます。ここでは、stackoverflow.com / a / 62155632/2025766で実行方法を見つけることができます
Fede Henze

10

スクリーンショットを撮る目的で、Appleはついにsimctlツールを使用してiOSシミュレーターのステータスバーの時間を上書きできるようにしました(Xcode 11以降)。

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

5
これはステータスバーをオーバーライドするだけだと思います(スクリーンショットの目的で)。ただし、日時APIの結果には影響しません。
Roun

7

これは少なくともiOS 13とXcode 11から利用可能なソリューションです。(以前のバージョンではテストしていませんでした)

デフォルトでは、iOSシミュレーターはMacの時刻を表示しますが、Xcodeのコマンドラインを使用して、ターミナルで次のコマンドを実行することでオーバーライドできます。

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

シミュレーター名を変更するデバイスに置き換えます。

iPhone時間のスクリーンショット

ステータスバーの場合、このオーバーライドがあります。

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.

時間は任意の文字列にすることができます。ただし、デバイスで日付を表示する場合は、ISO形式を使用する必要があります。たとえば、有効なISO日付文字列は「2007-01-09T10:41:00 + 01:00」になります。

それ以外の場合は、timeパラメータを文字列として使用でき、渡したものをすべて表示します。

ポール・ハドソンによる元の投稿のおかげでここにリンクがあります!


1
非常に良い可能性がありますが、別のタイムゾーンでアプリの機能をテストするためにタイムゾーンを実際に変更することはできません。たとえば、xcrun simctl status_bar "iPad Pro(11-inch)" override --time '2020-01-12T10:41:00-06:00'を使用すると、その時間は現在のCETタイムゾーンに変換され、iOSシミュレーターの時間は5に設定されます。 :41pm
ランダム制御

1
説明:用途が別のタイムゾーンに移動した場合のアプリの反応をテストしたいと思います。
ランダム制御

そうです、これはステータスバーにのみ影響します。私は画面上で現在の時刻をテスト出力しただけで、シミュレーションされたデバイスのシステム時刻は変更されませんでした。上部のディスプレイのみです。私はそれを反映するために私の投稿を編集しました。ありがとう
多数

5

タイムゾーンを変更するときに、メニューバーの時計をクリックするのが最も簡単な方法でした。次に、[日付と時刻の設定を開く]を選択し、[タイムゾーン]タブを選択します。

または、[システム環境設定]-> [日付と時刻]をクリックし、[タイムゾーン]タブを選択します。

OSXの使い方を知らない人のための指針です。


6
これは答えではないので、コメントにする必要があります。OS Xの使い方を知らないiOS開発者の数は...ゼロです。
ファットマン、

5

これは古いスレッドですが、私の質問に最も近いスレッドです。ヨーロッパのタイムゾーンをシミュレートする必要があります。この方法でうまくいきます。「日付と時刻」タップの代わりに「タイムゾーン」タップに移動します。[現在の場所を使用してタイムゾーンを自動的に設定する]チェックボックスをオフにし、垂直の長方形バー(青い点が付いている)をスライドさせて、システム時間をシミュレートします。

ここに画像の説明を入力してください


4

あなたは、設定できるTZだけでそのアプリのタイムゾーンを設定するためにXcodeのスキームで環境変数を。

スキームを管理する

あなたは使用することができUTCPSTEST、などのような場所ベースのタイムゾーンの名前America/Los_Angeles。十分に文書化されていませんが、タイムゾーン名は機能するはずです。

十分に文書化されていませんが、ソースは開発者フォーラムのApple Developer Support担当者です。


2
なぜこれは反対票が投じられるのですか?それは実際に私のために働いた唯一のものでした。
Jacob Rohde

これは本当にクリーンなソリューションです。複数の異なるタイムゾーンをテストする場合にも便利です。それぞれにTZ設定を追加しますが、一度に1つだけ選択するようにしてください。アメリカ/シカゴ、ヨーロッパ/イスタンブール、アジア/香港、太平洋/ホノルルを追加して、タイムゾーンに依存するバグを追跡できるように品揃えを取得しました。スクリーンショットをキャプチャしたり、複数のアプリを操作したりする必要がある場合、これは機能しませんが、1つのアプリをテストするために複数のタイムゾーンを切り替える非常に高速な方法です。
ハルミューラー

2

ハックなメソッドのスウィズリングを含む時間を変更する問題の自動解決策を提案しました:https : //stackoverflow.com/a/34793193/829338。私はそれに応じてタイムゾーンを変更するためにも機能するはずだと思います。


私は自分のアプリを自動的にテストする必要があり、sys時間を変更する必要がありました。私はそうしました、トムが提案したこと:幸せなハッキーな方法のスウィズリング。

説明のために、私は変更するだけで変更[NSDate date]はしません[NSDate dateWithTimeIntervalSince1970:]

まず、新しい[NSDateの日付]として機能するクラスメソッドを作成する必要があります。一定のtimeDifferenceだけ時間をシフトするように実装しました。

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

これまでのところ、かなり簡単です。ここからが楽しい部分です。クラスと交換実装の両方からメソッドを取得します(これはAppDelegateでは機能しましたが、UITestsクラスでは機能しませんでした)。このためには、インポートする必要があります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これはローカル通知のテストには機能しません。
Steve Moser 2017年

1

私のビルドサーバーはUTCであり、一部の単体テストではタイムゾーンをPSTにする必要がありました。NSTimeZoneのカテゴリを使用すると、コードを使用するためにAppleの実装をオーバーライドできます。迅速なプロジェクトにも有効です。

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

システムの日時設定を変更した後、Hardware> を選択する必要がありましたReset All Content And Settings
これだけがバージョン10.3(SimulatorApp-880.5 CoreSimulator-681.5.4)では機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.