在我以前的回答中,我认为你遇到了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