2012-02-03 55 views
0

在我的应用程序中,我希望允许用户每天仅输入一次值。将行动限制为每天一次

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

回答

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) 
{ 
    ... 
} 

UPDATE:由于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 
... 
+0

prolly将是一个好主意,将格式化程序保存在一个singelton或什么.. b/c如果你打算把上面的代码放在一个类别或其他东西.. n​​sdateformatters臭名昭着的实例化时间 – abbood 2014-04-28 11:09:06

+0

好点,我添加了一个关于这个的注释。 – 2014-04-29 12:04:05

1

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

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

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

当然,如果这是一个在线游戏(或类似的),你想验证服务器以及客户端的任何答案,用户很容易将日期或时区更改为“作弊”。

+1

+1对于本地日期欺诈的警告:P – 2012-02-03 19:26:19

+1

使用'NSWeekdayCalendarUnit',如果用户试图在一周后的同一天输入值,则会阻止它们这样做。我会用'(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)'代替。 – yuji 2012-02-06 10:56:06