iPhone 시뮬레이터에서 시간과 시간대를 변경하는 방법은 무엇입니까?


144

iPhone 시뮬레이터 에서 시간대와 시간대를 어떻게 변경 합니까?


시스템 시간과 날짜를 변경하는 것은 해결책이 아닙니다. 이는 xcode 타임 스탬프를 포함한 모든 Mac 응용 프로그램에 영향을줍니다. 올바른 동작은 시뮬레이터 위치를 변경할 때 시간과 시간대를 변경해야한다는 것입니다. 다른 모든 것들은 해결 방법입니다. 애플은 최대한 빨리이 문제를 해결할 수 있기를 바랍니다
루디

답변:


214

시스템 시간대를 사용한다고 생각합니다. 시스템 환경 설정에서 TZ를 변경하면 아마도 트릭이 될 것입니다.

설명을위한 스크린 샷


1
흠 ... 시뮬레이터에이 옵션이 없습니다. 내 전화의 설정-> 일반-> 날짜 및 시간에 있습니다. 내 시뮬레이터에는 날짜 및 시간 섹션이 없습니다.
Vito Andolini

6
아 .. 시뮬레이터 설정이 아니라 컴퓨터의 시스템 환경 설정에서 변경하십시오. 권리. 작동했습니다!
Vito Andolini

2
이 문제 중 하나는 시뮬레이터 시간이 2 분의 시스템 시간 변경 후 업데이트됩니다. 시뮬레이터 시간을 동시에 바꾸는 방법 ....
AsifHabib

1
나는 Mac의 시간을 바꾸었고 시뮬레이터 시간은 변하지 않았으며, 올바른 단계를 수행했는지, 시뮬레이터 시간이 변경되었는지 확인하고있었습니다. 그래서 시뮬레이터 시간은 10 ~ 15 초 후에 업데이트된다고 결론을 내 렸습니다. @ JPK 시스템의 문제를 모르는 가장 좋은 방법은 전체 시간 로그를 인쇄하고 문제가있는 곳을 확인하는 것입니다.
AsifHabib

2
Mac의 시스템 시간을 변경 한 다음 시뮬레이터를 다시 시작하십시오.
John Wong

41

시스템 날짜 시간 환경 설정을 변경 한 후 시뮬레이터를 다시 시작하면 변경 사항이 반영됩니다. 그것은 나를 위해 일했다.


171
끔찍한 해결책 (당신의 대답이 아닌 Apple 측). 이것은 실제로 시스템 시간을 변경하고 잠재적으로 컴퓨터의 물건을 손상시키는 안전한 대안으로 시뮬레이터가 할 수있는 것입니다.
devios1

3
@devios 이것은  시계와 함께 그 어느 때보 다 진실
lewis

@ Lewis42, 무슨 뜻인가요?
Iulian Onofrei

2
@lulian은 시간을 알려주는 새로운 장치가 있지만 시간대를 테스트하려면 여전히 엉망이되어야합니다. 그것은 의견을 던져 버렸다, 나는 좌절되고 있었다! :)
lewis

사실 @ Lewis42. 휴대 전화의 시스템 시간으로 혼란을 겪으면 Apple Watch의 이동 데이터와 같은 문제가 발생합니다. 시계의 데이터가 마음에 들면 테스트가 문제가됩니다.
제임스 화이트

35

Apple이 "시뮬레이션 위치"메뉴를 제공 할 때 "시뮬레이션 날짜"를 제공 한 경우 유용합니다. 내가하는 일은 날짜를 얻은 직후 (변수에 저장) 중단 점을 설정 한 다음 값을 수정하는 것입니다. 또는 날짜 변경을 확인한 지점을 수정하여 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

8

다음은 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 매개 변수를 문자열로 사용할 수 있으며 전달한 모든 것을 표시합니다.

Paul Hudson의 원래 게시물 덕분에 여기 링크가 있습니다 !


1
매우 좋은 가능성이지만 다른 시간대에서 앱 기능을 테스트하기 위해 시간대를 실제로 변경할 수는 없습니다. 예를 들어 xcrun simctl status_bar "iPad Pro (11-inch)"override --time '2020-01-12T10 : 41 : 00-06 : 00'을 사용하면 해당 시간을 현재 CET 시간대로 변환하고 iOS 시뮬레이터 시간을 5로 설정합니다 : 41pm
랜덤 컨트롤

1
설명 : 사용이 다른 시간대로 이동하는 경우 앱이 어떻게 반응하는지 테스트하고 싶습니다.
randomcontrol

당신은 옳습니다. 이것은 상태 표시 줄에만 영향을 미칩니다. 방금 화면에 현재 시간을 인쇄하여 테스트했으며 시뮬레이션 된 장치의 시스템 시간은 상단의 디스플레이 만 변경하지 않았습니다. 나는 그것을 반영하기 위해 게시물을 편집했다. 감사합니다
무리

6

당신은 설정할 수 있습니다 TZ단지 앱 시간대를 설정하는 Xcode의 계획에 환경 변수를.

체계 관리

UTC,, PSTEST장소 기반 시간대 이름 (예 :)을 사용할 수 있습니다 America/Los_Angeles. 잘 문서화되어 있지 않지만 시간대 이름 이 작동해야합니다.

잘 문서화되어 있지 않지만 소스는 개발자 포럼Apple 개발자 지원 담당자입니다 .


3
이것이 왜 투표에 실패합니까? 실제로 나를 위해 일한 것은 유일했습니다.
Jacob Rohde

1
이것은 정말 깨끗한 솔루션입니다. 여러 시간대를 테스트하려는 경우에도 좋습니다. 각 시간대마다 TZ 설정을 추가하지만 한 번에 하나만 선택해야합니다. 방금 시간 대별 버그를 추적 할 수 있도록 구색을 얻기 위해 America / Chicago, Europe / Istanbul, Asia / Hong_Kong 및 Pacific / Honolulu를 추가했습니다. 스크린 샷을 캡처하거나 여러 앱으로 작업해야하는 경우에는 작동하지 않지만 여러 시간대간에 전환하여 단일 앱을 테스트하는 가장 빠른 방법입니다.
Hal Mueller

5

시간대를 변경할 때 가장 쉬운 방법은 메뉴 막대에서 시계를 클릭하는 것입니다. 그런 다음 "날짜 및 시간 환경 설정 열기"를 선택한 다음 시간대 탭을 선택하십시오.

또는 시스템 환경 설정-> 날짜 및 시간을 선택하고 시간대 탭을 선택하십시오.

OSX와 관련하여 자신의 길을 모르는 사람을위한 포인터입니다.


6
이것은 답변이 아니므로 주석이어야합니다. OS X를 잘 모르는 iOS 개발자의 수는 ... 제로입니다.
phatmann 2016 년

5

이것은 오래된 스레드이지만 내 질문에 가장 가깝습니다. 유럽 ​​시간대를 시뮬레이트해야합니다.이 방법은 저에게 효과적입니다. '날짜 및 시간'탭 대신 'TimeZone'탭으로 이동하십시오. '현재 위치를 사용하여 시간대를 자동으로 설정'확인란을 선택 취소하고 수직 사각형 막대 (파란색 점이 있음)를 밀어 시스템 시간을 시뮬레이션하십시오.

여기에 이미지 설명을 입력하십시오


2

해키 메소드 스위 즐링 ( 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);

IIRC 로컬 알림 테스트에는 작동하지 않습니다.
Steve Moser

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.