我接管了一些程序员的项目,不幸的是,他们在代码中留下了很多不清楚的地方。基本上,我们将一些航班事件以及起飞和到达时间存储在我们的数据库中。数据库(据我们所知)一切都存储在UTC中(应有的话),在iOS应用中,他们使用一些Realm对象作为数据库模型。
我基本上想在24小时内查找所有航班,对应于用户设备的24小时工作日。
- (NSDate *)beginningOfDayInDeviceTimeZone {
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = [[NSCalendar currentCalendar] ordinalityOfUnit:(NSCalendarUnitDay) inUnit:(NSCalendarUnitEra) forDate:self];
return [[NSCalendar currentCalendar] dateFromComponents:components];
}
- (NSDate *)endOfDayInDeviceTimeZone {
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = [[NSCalendar currentCalendar] ordinalityOfUnit:(NSCalendarUnitDay) inUnit:(NSCalendarUnitEra) forDate:self];
components.day += 1;
return [[NSCalendar currentCalendar] dateFromComponents:components];
}
据我了解,所有时间通常都是Unix时间戳。因此,只有在我想显示时间时才需要时间转换。但是我认为我们的程序员搞砸了,但这是另一回事了。
我想查询此时间范围内的所有事件。我想使用我们的程序员创建的方法:
+ (NSMutableArray *)getDataForUser:(NSString *)userEmail betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate {
NSMutableArray *planDataArray = [NSMutableArray array];
NSLog(@"startDate %@ endDate: %@", startDate, endDate);
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"userEmail == %@ AND (destinationTime >= %@ AND departureTime <= %@)",userEmail, startDate, endDate, startDate, endDate, startDate];
NSLog(@"Predicate: %@", predicate); sortedResultsUsingProperty:@"departureTime" ascending:YES];
if (results.count > 0) {
for (FMPlanData *planData in results) {
if (![planData isInvalidated]) {
[planDataArray addObject:planData];
}
}
}
return planDataArray;
}
这是我的问题:
为什么给谓词方法分配的参数(startDate和endDate)比谓词字符串中的%@多?这是做什么的?
NSLogs来自我。现在,一个特定呼叫的输出为:
2019-04-02 16:17:07.849451 + 0200 FollowMe [4891:158214] StartDate Tue Apr 2 2019年2月00:00:00
2019-04-02 16:17:07.849666 + 0200 FollowMe [4891:158214] EndDate:Wed Apr 3 30:00:00 2019
2019-04-02 16:17:07.849870 + 0200 FollowMe [4891:158214]谓词:userEmail ==“ xxx” AND destinationTime> = CAST(575848800.000000,“ NSDate”)AND离职时间<= CAST(575935200.000000,“ NSDate”)
好,在这里我很困惑。首先,向我显示了太多错误的事件。但是我最困惑的是这些CAST(...)时间戳。如果将575935200.000000转换为正常日期,我将在1988年4月1日得到。我的思想错误在哪里?