在我的应用中,我想让用户每天只输入一次值。
如何确保存储的NSDate不在当天?我可以比较两个NSDate的日值而忽略时间吗?
答案 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>