web-dev-qa-db-ja.com

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

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

122
Rahul Vyas

私はそれがあなたのシステムタイムゾーンを使用していると推測しているので、システム環境設定でTZを変更するとおそらくトリックを行うでしょう

Screenshot for description

185
nduplessis

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

32
Vishal Shah

Appleが "Simulate Location"メニューを提供するように "Simulate date"を提供した場合に役立ちます。または、値を変更するか、日付の変更をチェックしてtrueを返すスポットを変更します。

31

タイムゾーンを変更するとき、それを行う最も簡単な方法は、メニューバーの時計をクリックすることでした。そして、「日付と時刻の設定を開く」を選択し、「タイムゾーン」タブを選択します。

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

OSXについての彼らの方法を知らないかもしれないだれでものためのちょうどポインター。

5
Lasse

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

enter image description here

4
Ohmy

ハッキーメソッドのスウィズリングを含む時間を変更する問題の自動解決策を提案しました: 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);
2
Sebastian Hojas

ビルドサーバーは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
1
odyth