iPhone シミュレーターで時間とタイムゾーンを変更するにはどうすればよいですか?
私はそれがあなたのシステムタイムゾーンを使用していると推測しているので、システム環境設定でTZを変更するとおそらくトリックを行うでしょう
システムの日時設定を変更した後、シミュレーターを再起動すると、変更が反映されます。それは私のために働いた。
Appleが "Simulate Location"メニューを提供するように "Simulate date"を提供した場合に役立ちます。または、値を変更するか、日付の変更をチェックしてtrueを返すスポットを変更します。
タイムゾーンを変更するとき、それを行う最も簡単な方法は、メニューバーの時計をクリックすることでした。そして、「日付と時刻の設定を開く」を選択し、「タイムゾーン」タブを選択します。
または、[システム環境設定]-> [日付と時刻]をクリックし、[タイムゾーン]タブを選択します。
OSXについての彼らの方法を知らないかもしれないだれでものためのちょうどポインター。
ハッキーメソッドのスウィズリングを含む時間を変更する問題の自動解決策を提案しました: https://stackoverflow.com/a/34793193/829338 。それに応じてタイムゾーンを変更しても機能するはずです。
私は自分のアプリを自動的にテストする必要があり、システム時間を変更する必要がありました。私は、トムが提案したことをしました。
説明のため、[NSDate date]
のみを変更し、[NSDate dateWithTimeIntervalSince1970:]
は変更しません。
最初に、新しい[NSDate date]として機能するクラスメソッドを作成する必要があります。単に一定の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の実装をオーバーライドしてコードを使用できます。 Swiftプロジェクトのみでも動作します。
//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