在app中设置iPhone日期/时间以进行测试?

时间:2011-04-20 13:06:40

标签: iphone objective-c ios nsdate

我的应用程序中有许多依赖于日期/时间的功能(例如“如果日期是x,显示y)。我使用[NSDate日期]来获取用户的当前日期/时间。我可以测试功能通过手动更改我的iPhone上的日期/时间,但我想知道是否有一种方法以编程方式覆盖当前时间,以便我可以在模拟器中更快地进行测试。

4 个答案:

答案 0 :(得分:5)

另一种方法是提供+(NSDate *)日期的自定义实现。您可以使用JRSwizzle来调用此类方法。为NSDate制作一个小类:

static NSTimeInterval seconds = 1300000000;

@interface NSDate (Fixed)
   + (NSDate *)fixedDate;
@end

@implementation NSDate (Fixed)
+ (NSDate *)fixedDate
{
  return [NSDate dateWithTimeIntervalSince1970:seconds];
}
@end

然后在您希望拥有固定日期的代码中执行以下操作:

NSError *error;
[NSDate jr_swizzleClassMethod:@selector(date) withClassMethod:@selector(fixedDate) error:&error];
NSLog(@"Date:%@", [NSDate date]);

日志打印出来:

2011-09-01 11:35:27.844 tests[36597:10403] Date:2011-03-13 07:06:40 +0000

答案 1 :(得分:3)

您可以使用所需的任何日期/时间创建NSDate对象。只需通过一种方法运行代码即可获得“当前”时间,并在此方法中返回生产的实际日期或您选择的某个测试日期。

答案 2 :(得分:2)

NSDate上创建一个类别并覆盖+[NSDate date]方法

+ (instancetype)date
{
  return [NSDate dateWithTimeIntervalSince1970:100000]; // Replace with any date you want
}

答案 3 :(得分:0)

dateByAddingTimeInterval:

返回一个新的NSDate对象,该对象设置为相对于接收者的给定秒数。

- (id)dateByAddingTimeInterval:(NSTimeInterval)seconds

参数 秒 添加到接收器的秒数。使用负值表示返回的对象在接收者之前指定日期。 回报价值 一个新的NSDate对象,设置为相对于接收器的秒秒。返回的日期可能与接收者的表示不同。

来源:文档:p