如何在 iPhone 模拟器中更改时间和时区?
Posted
技术标签:
【中文标题】如何在 iPhone 模拟器中更改时间和时区?【英文标题】:How to change time and timezone in iPhone simulator? 【发布时间】:2010-12-14 13:18:50 【问题描述】:如何在iPhone 模拟器中更改时间和时区?
【问题讨论】:
更改系统时间和日期是没有办法的。这会影响所有 Mac 应用程序,包括 xcode 时间戳。正确的行为是模拟器位置的任何更改都必须更改时间和时区。所有其他事情都只是解决方法。希望苹果能尽快解决这个问题 【参考方案1】:我猜它使用您的系统时区,所以在系统偏好设置中更改 TZ 可能会解决问题
【讨论】:
嗯...我的模拟器上没有这个选项。在我的手机上,它位于设置 -> 常规 -> 日期和时间。在我的模拟器上,日期和时间部分不存在。 哦...在您机器的系统偏好设置中更改它,而不是模拟器的设置。正确的。成功了! 这里有一个问题,模拟器时间在更改系统时间 2 分钟后更新。任何同时改变模拟器时间的方法...... 我改变了Mac的时间,模拟器时间没有改变,我正在检查我是否做了正确的步骤,模拟器时间改变了。所以我得出结论,模拟器时间在 10 到 15 秒后更新,但这对我来说没问题。 @JPK 我不知道你系统的问题,最好的方法是打印完整的时间日志并检查问题所在。 修改mac系统时间,然后重启模拟器。【参考方案2】:您可以在 Xcode 方案中设置 TZ
环境变量来为该应用设置时区。
您可以使用UTC
、PST
、EST
,以及基于地点的时区名称,例如America/Los_Angeles
。它没有很好的记录,但我怀疑任何time zone name 都应该工作。
没有很好的记录,但来源是Apple Developer Support rep on the developer forums。
【讨论】:
为什么会被否决?这是唯一对我有用的东西。 这是一个非常干净的解决方案。如果您想测试多个不同的时区,这也很棒:为每个时区添加一个 TZ 设置,但请记住一次只选择一个。我刚刚添加了 America/Chicago、Europe/Istanbul、Asia/Hong_Kong 和 Pacific/Honolulu 以获得分类,以便我可以追踪与时区相关的错误。如果您需要捕获屏幕截图或使用多个应用程序,这将不起作用,但它是在多个时区之间切换以测试单个应用程序的一种非常快速的方法。 对于 Xcode 12.3 / ios 14.3,此解决方案只有在您擦除并重新启动模拟器设备时才能正常工作。如果您有两个设置了不同 TZ 值的方案,则时区将“坚持”到您运行的第一个方案,并且对于第二个方案将不正确地显示。重新启动模拟器使其工作。呻吟。【参考方案3】:更改系统日期时间首选项后重新启动模拟器,您将看到所反映的更改。它对我有用。
【讨论】:
糟糕的解决方案(Apple 方面,而不是您的答案)。这正是模拟器应该能够做的事情,作为实际更改系统时间并可能破坏计算机上的东西的安全替代方案。 @devios 使用 Watch 比以往任何时候都更真实 @Lewis42,你是什么意思? @lulian 只是说有一种新设备可以显示时间,但是您仍然必须像这样乱来测试时区。这是一个扔掉的评论,我很沮丧! :) 非常正确,@Lewis42。在手机上乱搞系统时间真的会搞砸 Apple Watch 上的运动数据之类的东西。如果您关心手表上的数据,测试就会出现问题。【参考方案4】:如果 Apple 在提供“模拟位置”菜单时提供“模拟日期”会很有用。我所做的是在获取日期后立即设置断点(将其保存在变量中),然后修改值。或者只是修改我检查日期更改的位置并使其返回 true。
【讨论】:
为了更好地回答这个问题:你如何修改它?你给它加一个间隔?你能分享一些代码吗? 你现在可以做,这里***.com/a/62155632/2025766你可以找到方法 @FedeH 这不是一个解决方案:它只允许更改显示的时间,而不是模拟器的实际时间,以便您可以在代码中使用它(即Date()返回的时间)【参考方案5】:为了截屏,苹果终于可以使用simctl工具在iOS模拟器的状态栏上覆盖时间(从Xcode 11开始):
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
【讨论】:
我认为这只会覆盖状态栏(出于屏幕截图的目的)。但它不会影响时间/日期 API 的结果。【参考方案6】:这是至少可从 iOS 13 和 Xcode 11 获得的解决方案。 (没有用以前的版本测试) [编辑] 这只会改变 cmets 中的状态栏!
默认情况下,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 format。 例如,一个有效的 ISO 日期字符串是 '2007-01-09T10:41:00+01:00'
否则,您可以将时间参数用作字符串,它会显示您传入的任何内容。
感谢 Paul Hudson 的原帖,这里是 the link!
【讨论】:
非常好的可能性,但不允许真正更改时区以在不同时区测试应用程序功能。当使用例如xcrun simctl status_bar "iPad Pro (11-inch)" override --time '2020-01-12T10:41:00-06:00' 它将时间转换为我当前的 CET 时区并将 iOS 模拟器时间设置为下午 5:41 解释:我想测试我的应用程序在用户旅行到不同时区时的反应。 你说得对,这只影响状态栏,我只是做了一个测试,在屏幕上打印出当前时间,并没有改变模拟设备的系统时间,只在顶部显示.我编辑了我的帖子以反映这一点。谢谢【参考方案7】:这是一个旧线程,但它最接近我的问题。我需要模拟欧洲的时区,这种方法对我有用。转到“时区”点击而不是“日期和时间”点击。取消选中“使用当前位置自动设置时区”框并滑动垂直矩形条(上面带有蓝点)以模拟您的系统时间。
【讨论】:
【参考方案8】:更改时区时,我发现最简单的方法是单击菜单栏中的时钟。然后选择“打开日期和时间首选项”,然后选择选项卡时区。
或者 System Preferences -> Date and Time 并选择选项卡 Time Zone。
对于那些可能不了解 OSX 的人来说,这只是一个指针。
【讨论】:
这不是答案,所以应该是评论。不了解 OS X 的 iOS 开发人员的数量是……零。【参考方案9】:我已经提出了一种自动解决时间更改问题的方法,其中包括 hacky 方法调配:https://***.com/a/34793193/829338。我认为这也应该适用于相应地更改时区。
我需要自动测试我的应用,这需要更改系统时间。我做到了,正如 Tom 建议的那样:快乐的 hacky 方法 swizzling。
出于演示目的,我只更改了[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 这不适用于测试本地通知。【参考方案10】:我的构建服务器是 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
【讨论】:
【参考方案11】:更改系统日期时间首选项后,我必须选择Hardware
> Reset All Content And Settings
。
只有这在 10.3 版(SimulatorApp-880.5 CoreSimulator-681.5.4)中对我有用。
【讨论】:
以上是关于如何在 iPhone 模拟器中更改时间和时区?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 6 / 6 Plus 模拟器是不是支持更改显示缩放模式?
在终端测试时如何更改默认的 Xcode iphone 模拟器?