2012-02-03 92 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