回答:
私はあなたのシステムのタイムゾーンを使用していると思いますので、システム環境設定でTZを変更するとおそらくうまくいくでしょう
システムの日付時刻設定を変更した後、シミュレータを再起動すると、変更が反映されます。それは私のために働いた。
Appleが「Simulate Location」メニューを提供したので、「Simulate date」を提供した場合、それは役に立ちます。日付を取得した直後にブレークポイントを設定し(変数に保存)、値を変更します。または、日付の変更をチェックする場所を変更して、trueを返すようにします。
これは少なくともiOS 13とXcode 11から利用可能なソリューションです。(以前のバージョンではテストしていませんでした)
デフォルトでは、iOSシミュレーターはMacの時刻を表示しますが、Xcodeのコマンドラインを使用して、ターミナルで次のコマンドを実行することでオーバーライドできます。
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
シミュレーター名を変更するデバイスに置き換えます。
ステータスバーの場合、このオーバーライドがあります。
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パラメータを文字列として使用でき、渡したものをすべて表示します。
ポール・ハドソンによる元の投稿のおかげでここにリンクがあります!
あなたは、設定できるTZ
だけでそのアプリのタイムゾーンを設定するためにXcodeのスキームで環境変数を。
あなたは使用することができUTC
、PST
、EST
、などのような場所ベースのタイムゾーンの名前America/Los_Angeles
。十分に文書化されていませんが、タイムゾーン名は機能するはずです。
十分に文書化されていませんが、ソースは開発者フォーラムのApple Developer Support担当者です。
ハックなメソッドのスウィズリングを含む時間を変更する問題の自動解決策を提案しました: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);
私のビルドサーバーは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
システムの日時設定を変更した後、Hardware
> を選択する必要がありましたReset All Content And Settings
。
これだけがバージョン10.3(SimulatorApp-880.5 CoreSimulator-681.5.4)では機能しました。