在我以前的回答中,我認爲你遇到了SQLite持久對象的問題,但事實並非如此。我認爲你只是誤解了下面的代碼實際上是這樣做的:
NSLog(@"The date is %@", [NSDate date]);
爲什麼你在不同的語言環境中獲得不同的日誌輸出的原因是不因爲NSDate的,那是因爲NSDateFormatter的使用在引擎蓋下使用%@
將[NSDate date]
的字符串表示形式插入到日誌字符串中。事實上,NSDate沒有「12小時」或「24小時」語言環境的概念 - 它只是一個時間點的表示。
當您將NSDate轉換爲字符串時(例如在NSLog語句中或作爲SQL查詢字符串的一部分)時,區域設置將起作用。當你想這樣做,你應該指定自己明確的格式化,像這樣:
NSDateFormatter *formatter = [[NSDateFormatter alloc] initWithDateFormat:@"yyyy-MM-dd HH:mm:ss" allowNaturalLanguage:NO];
NSLog(@"The date is %s", [formatter stringFromDate:[NSDate date]]);
[formatter release];
使用上面的,你應該得到相同的字符串,無論用戶的區域設置。
至於你的SQL查詢,我正確地認爲你也使用%@
插入日期到查詢字符串?如果是這樣,你應該這樣做,而不是:
NSString* criteriaTemplate = @"WHERE date(due) BETWEEN date(%d) AND date('now', 'localtime')";
NSString* criteria = [NSString stringWithFormat: criteriaTemplate, [myNSDate timeIntervalSince1970]];
NSArray* todayTasks = [Task findByCriteria:criteria];
希望這會有所幫助。
謝謝,彌敦道 - 這幫助我更好地理解它。它引導我查看setDateFormat如何工作,這幫助我找到了我分別公佈的NSLocale覆蓋。非常感激。 – Nick 2009-09-06 12:32:46