NSDate今天午夜

EAB*_*EAB 0 logic date nsdate nspredicate

我正在建立一个NSPredicate来获取Core Data,它的设置如下:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", todaysDate, tomorrowsDate];
Run Code Online (Sandbox Code Playgroud)

我需要todaysDate今天00:00:00,我需要tomorrowsDate今天23:59:59.

我不能设置todaysDate等于[NSDate date]然后用NSDateComponents操纵小时,分钟和秒,因为[NSDate date]给我一个比我当地实际时间提前5小时的日期(所以如果它是在5月6日晚上11点,那么[NSDate date]会给我"2014-05-07 04:00:00 +0000",但我仍然需要它认为它是5月6日,而不是7日!).

我如何操纵我在Xcode中使用的工具,以便始终将我的变量todaysDate变为今天午夜,并tomorrowsDate在明天午夜之前成为第二个?

Mar*_*n R 5

rangeOfUnit:...方法NSCalendar是计算当前的一天的开始,明天开始一个方便的方法 在你的本地时区:

NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *todaysDate;
NSDate *tomorrowsDate;
NSTimeInterval interval;
[cal rangeOfUnit:NSDayCalendarUnit startDate:&todaysDate interval:&interval forDate:now];
tomorrowsDate = [todaysDate dateByAddingTimeInterval:interval];
Run Code Online (Sandbox Code Playgroud)

这样你就可以在谓词中使用它>=<:

[NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", todaysDate, tomorrowsDate]
Run Code Online (Sandbox Code Playgroud)

获取当天的所有对象.


备注:不要让对象的NSLog()输出NSDate混淆你. NSDate代表一个绝对的时间点,对时区一无所知. NSLog(@"%@", todaysDate)根据GMT时区而不是您当地的时区打印日期.

要根据您的时区打印日期,请p todaysDate在调试器控制台(而不是po)中使用,或打印

[todaysDate descriptionWithLocale:[NSLocale currentLocale]]
Run Code Online (Sandbox Code Playgroud)