如何在iPhone模拟器中更改时间和时区?


Answers:


214

我猜它使用您的系统时区,因此在“系统偏好设置”中更改TZ可能会解决问题

截图说明


1
嗯...我的模拟器上没有此选项。在我的手机上,它位于设置->常规->日期和时间下。在我的模拟器上,“日期和时间”部分不存在。
维托·安多里尼

6
哦...在机器的系统偏好设置中更改它,而不是在模拟器的设置中更改它。对。可行!
维托·安多里尼

2
这样做的一个问题是,在更改系统时间2分钟后更新了模拟器时间。任何其同时改变所述模拟器时间....方法
AsifHabib

1
我更改了Mac的时间,并且模拟器的时间没有改变,我正在检查是否执行了正确的步骤,模拟器的时间已更改。因此,我得出结论,模拟器时间会在10到15秒后更新,但这对我来说是可以的。@JPK我不知道您的系统有问题,最好的方法是打印完整的时间日志并检查问题所在。
AsifHabib

2
更改mac的系统时间,然后重新启动模拟器。
John Wong

41

更改系统日期时间首选项后,重新启动模拟器,您将看到反映的更改。它为我工作。


170
糟糕的解决方案(苹果方面,而不是您的答案)。这是模拟器应该能够做的事情,它是安全的替代方法,可以代替实际更改系统时间并可能破坏计算机上的内容。
devios1

3
@devios使用观看,这比以往更真实
刘易斯

@ Lewis42,你是什么意思?
Iulian Onofrei 2015年

2
@lulian只是有一种新设备可以说出时间,但是您仍然必须像这样弄乱时间以测试时区。这是一个扔掉的评论,我感到沮丧!:)
刘易斯2015年

非常正确,@ Lewis42。弄乱手机上的系统时间确实会弄糟Apple Watch上的运动数据之类的东西。如果您关心手表上的数据,会使测试成为问题。
詹姆斯·怀特

35

如果Apple提供了“模拟日期”,因为它们提供了“模拟位置”菜单,这将很有用。我要做的是在获取日期后立即设置一个断点(将其保存在变量中),然后修改该值。或者只是修改我检查日期更改并使其返回true的位置。


为了获得更好的答案:您如何修改它?您添加间隔了吗?可以共享一些代码吗?
亲爱的

您现在可以进行操作,在这里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的结果。
罗恩

7

这是至少可从iOS 13和Xcode 11获得的解决方案。(未使用以前的版本进行测试)

默认情况下,iOS Simulator会显示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英寸)”替代--time'2020-01-12T10:41:00-06:00'时,它将把该时间转换为我当前的CET时区,并将iOS模拟器时间设置为5 :41pm
randomcontrol

1
举例说明:我想测试用户在不同时区旅行时应用程序的反应。
randomcontrol

没错,这只影响状态栏,我只是做了一个测试,将屏幕上的当前时间打印出来,它并没有改变模拟设备的系统时间,只改变了顶部的显示。我编辑了帖子以反映这一点。谢谢
众多

5

更改时区时,我发现最简单的方法是单击菜单栏中的时钟。然后选择“打开日期和时间首选项”,然后选择“时区”选项卡。

或者,选择系统偏好设置->日期和时间,然后选择选项卡时区。

对于那些可能不了解OSX方式的人来说,这只是一个指针。


6
这不是答案,因此应该是评论。不了解OS X方式的iOS开发人员的数量为...零。
phatmann '16

5

这是一个旧线程,但它最接近我的问题。我需要模拟欧洲时区,该方法对我有效。转到“时区”点击,而不是“日期和时间”点击。取消选中“使用当前位置自动设置时区”框,然后滑动垂直矩形条(上面带有蓝色圆点)以模拟系统时间。

在此处输入图片说明


4

您可以TZ在Xcode方案中设置环境变量以仅为该应用设置时区。

管理计划

您可以使用UTCPSTEST,以及基于地点的时区的名称,如America/Los_Angeles。没有足够的文档记录,但是我怀疑任何时区名称都可以使用。

它的文档记录不充分,但是来源是开发人员论坛上的Apple开发人员支持代表


2
为什么这个被否决?实际上,这是唯一对我有用的东西。
雅各布·罗德

这是一个非常干净的解决方案。如果您要测试多个不同的时区,也很棒:为每个时区添加一个TZ设置,但请记住一次只能选择一个。我刚刚添加了美国/芝加哥,欧洲/伊斯坦布尔,亚洲/香港和太平洋地区/檀香山,以进行分类,这样我就可以找到与时区相关的错误。如果您需要捕获屏幕截图或使用多个应用程序,则此方法将无效,但这是在多个时区之间切换以测试单个应用程序的快速方法。
哈勒·穆勒

2

我已经提出了一种解决时间更改问题的自动解决方案,其中包括修改方法繁琐: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);

IIRC不适用于测试本地通知。
史蒂夫·摩泽

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)中,只有这对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.