如何在iPhone模拟器中更改时间和时区?
如何在iPhone模拟器中更改时间和时区?
Answers:
我猜它使用您的系统时区,因此在“系统偏好设置”中更改TZ可能会解决问题
更改系统日期时间首选项后,重新启动模拟器,您将看到反映的更改。它为我工作。
如果Apple提供了“模拟日期”,因为它们提供了“模拟位置”菜单,这将很有用。我要做的是在获取日期后立即设置一个断点(将其保存在变量中),然后修改该值。或者只是修改我检查日期更改并使其返回true的位置。
这是至少可从iOS 13和Xcode 11获得的解决方案。(未使用以前的版本进行测试)
默认情况下,iOS Simulator会显示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的原始帖子,这里的链接!
更改时区时,我发现最简单的方法是单击菜单栏中的时钟。然后选择“打开日期和时间首选项”,然后选择“时区”选项卡。
或者,选择系统偏好设置->日期和时间,然后选择选项卡时区。
对于那些可能不了解OSX方式的人来说,这只是一个指针。
您可以TZ
在Xcode方案中设置环境变量以仅为该应用设置时区。
您可以使用UTC
,PST
,EST
,以及基于地点的时区的名称,如America/Los_Angeles
。没有足够的文档记录,但是我怀疑任何时区名称都可以使用。
它的文档记录不充分,但是来源是开发人员论坛上的Apple开发人员支持代表。
我已经提出了一种解决时间更改问题的自动解决方案,其中包括修改方法繁琐:https ://stackoverflow.com/a/34793193/829338 。我认为这也应该相应地更改时区。
我需要自动测试我的应用程序,这需要更改系统时间。汤姆(Tom)的建议是我做到了:快乐的hacky方法泛滥成灾。
出于演示目的,我仅更改[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)中,只有这对我有用。