回答
日期只是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
...
您可以使用NSDateComponents的实例以及用户的日历查找周日并将其与上次更新进行比较。例如,
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
NSInteger weekday = [comps weekday];
或者,你可以使用的方法components:fromDate:toDate:options:
检查的天数在时间间隔两个日期之间,而不是当前日历中的日期。如果您希望每24小时回答一次而不是一周的答案,这可能会更有用。
当然,如果这是一个在线游戏(或类似的),你想验证服务器以及客户端的任何答案,用户很容易将日期或时区更改为“作弊”。
+1对于本地日期欺诈的警告:P – 2012-02-03 19:26:19
使用'NSWeekdayCalendarUnit',如果用户试图在一周后的同一天输入值,则会阻止它们这样做。我会用'(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)'代替。 – yuji 2012-02-06 10:56:06
- 1. CPU的限制,每天一次
- 2. 每天限制竞赛一次
- 3. 限制用户每天只玩一次
- 4. Dojo日期限制为每月一天
- 5. 限制每天安装一次或两次
- 6. iOS每天运行一次
- 7. Rails按IP地址每次限制每天投票1次
- 8. VBA每天运行一次宏一次
- 9. iOS/Swift - 限制访问视图控制器到每天一次
- 10. 每天只有一次用户限制表格提交
- 11. PHP MySQL考勤 - 如何限制时间(每天一次)
- 12. 表格设计 - 将输入限制为每月一次
- 13. 将CsvListReader限制为一行
- 14. 运行任务周期性(每天一次/每周一次)
- 15. 限制'滚轮'delta以每次滚动触发一次
- 16. 每天自动刷新页面一次
- 17. PHP每隔x天做一次动作
- 18. 触发器只能运行一次,每天运行一次
- 19. C#每30天运行一次代码
- 20. 每天执行一次代码
- 21. 每天执行一次任务
- 22. RoR 3将用户限制为每天2帖子
- 23. 将每次访客用户的操作限制为一次(不登录)
- 24. 每天点击一次URL
- 25. 每天更新一次
- 26. 显示DIV每天一次
- 27. Mysql - 每天投票一次
- 28. HealthKit requestAuthorizationToShareTypes每天一次?
- 29. c#限制每次迭代
- 30. 每天,每周,每月只显示一次uialertview一次?
prolly将是一个好主意,将格式化程序保存在一个singelton或什么.. b/c如果你打算把上面的代码放在一个类别或其他东西.. nsdateformatters臭名昭着的实例化时间 – abbood 2014-04-28 11:09:06
好点,我添加了一个关于这个的注释。 – 2014-04-29 12:04:05