답변:
시스템 시간대를 사용한다고 생각합니다. 시스템 환경 설정에서 TZ를 변경하면 아마도 트릭이 될 것입니다.
시스템 날짜 시간 환경 설정을 변경 한 후 시뮬레이터를 다시 시작하면 변경 사항이 반영됩니다. 그것은 나를 위해 일했다.
Apple이 "시뮬레이션 위치"메뉴를 제공 할 때 "시뮬레이션 날짜"를 제공 한 경우 유용합니다. 내가하는 일은 날짜를 얻은 직후 (변수에 저장) 중단 점을 설정 한 다음 값을 수정하는 것입니다. 또는 날짜 변경을 확인한 지점을 수정하여 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 매개 변수를 문자열로 사용할 수 있으며 전달한 모든 것을 표시합니다.
Paul Hudson의 원래 게시물 덕분에 여기 링크가 있습니다 !
당신은 설정할 수 있습니다 TZ
단지 앱 시간대를 설정하는 Xcode의 계획에 환경 변수를.
UTC
,, PST
및 EST
장소 기반 시간대 이름 (예 :)을 사용할 수 있습니다 America/Los_Angeles
. 잘 문서화되어 있지 않지만 시간대 이름 이 작동해야합니다.
잘 문서화되어 있지 않지만 소스는 개발자 포럼 의 Apple 개발자 지원 담당자입니다 .
시간대를 변경할 때 가장 쉬운 방법은 메뉴 막대에서 시계를 클릭하는 것입니다. 그런 다음 "날짜 및 시간 환경 설정 열기"를 선택한 다음 시간대 탭을 선택하십시오.
또는 시스템 환경 설정-> 날짜 및 시간을 선택하고 시간대 탭을 선택하십시오.
OSX와 관련하여 자신의 길을 모르는 사람을위한 포인터입니다.
해키 메소드 스위 즐링 ( https://stackoverflow.com/a/34793193/829338) 을 포함하여 시간을 변경하는 문제에 대한 자동 솔루션을 제안했습니다 . 시간대를 적절하게 변경해야한다고 가정합니다.
시스템 시간을 변경해야하는 앱을 자동으로 테스트해야했습니다. 나는 Tom이 제안한 것 : 행복한 해키 방법 스위 즐링.
실증 목적으로 만 변경 [NSDate date]
하지만 변경 하지는 않습니다 [NSDate dateWithTimeIntervalSince1970:]
.
먼저 새로운 [NSDate 날짜] 역할을하는 클래스 메소드를 작성해야합니다. 상수 시간 차이로 단순히 시간을 이동하도록 구현했습니다.
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)에서만 작동했습니다.