限制行动一天一次

时间:2012-02-03 19:15:57

标签: objective-c ios nsdate ios5

在我的应用中,我想让用户每天只输入一次值。

如何确保存储的NSDate不在当天?我可以比较两个NSDate的日值而忽略时间吗?

2 个答案:

答案 0 :(得分:2)

日期只是NSTimeIntervals的包装器。他们没有当地时间的概念,所以你不能直接从他们那里获得一天的价值。

您可以使用NSDateFormatter,如下所示:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/MM/dd"];

NSString *today = [formatter stringFromDate:[NSDate date]];

NSString *dateToCompare = [formatter stringFromDate:someDate];

if ([dateToCompare isEqualToString:today])
{
    ...
}

日期格式化程序使用您的本地时区输出日期,因此您可以保证当天对用户来说是正确的。

如果您确实希望确保事件间隔超过24小时(以防止作弊),那就更容易了,只需这样做:

if ([date1 timeIntervalSinceDate:date2] > 3600*24)
{
    ...
}

更新:正如评论中abbood指出的那样,创建NSDateFormatter对象可能会很昂贵/很慢,所以如果它们会被重用,你应该挂起它们。

将它们存储在静态变量或单例中并不是一个好主意,因为它们不是线程安全的,但您可以将它们存储在当前线程的threadDictionary中,如下所示:

//check for a cached formatter and recreate if needed
NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSDateFormatter *formatter = threadDict[@"someUniqueKey"];
if (!formatter)
{
    //create the formatter
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy/MM/dd"];

    //cache the formatter
    threadDict[@"someUniqueKey"] = formatter;
}

//use the formatter
...

答案 1 :(得分:1)

您可以使用NSDateComponents的实例以及用户的日历来查找工作日并将其与上次更新进行比较。例如,

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
NSInteger weekday = [comps weekday];

或者,您可以使用components:fromDate:toDate:options:方法检查两个日期之间的时间间隔中的天数,而不是日历中的当前日期。如果您希望每24小时而不是一周中的某一天允许答案,这可能会更有用。

当然,如果这是针对在线游戏(或任何类似的),您想验证服务器和客户端上的任何答案,用户很容易将日期或时区更改为“作弊”。 / p>