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