NSDate, часовые пояса и путаница с метками времени Unix - PullRequest
1 голос
/ 02 апреля 2019

Я взял на себя проект некоторых программистов, которые, к сожалению, многое оставили неясным в коде.По сути, мы сохранили некоторые события полета в нашей базе данных с временем отправления и прибытия.В базе данных (насколько мы можем судить) все хранится в 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;
}

Вот мои вопросы:

  1. Почему есть больше параметров (startDate и endDate), которые приведенык методу предиката, чем в строке предиката является% @?Что это делает?

  2. NSLogs от меня.Вывод одного конкретного вызова теперь:

2019-04-02 16: 17: 07.849451 + 0200 FollowMe [4891: 158214] StartDate Tue Apr 2 00:00:00 2019
2019-04-02 16: 17: 07.849666 + 0200 FollowMe [4891: 158214] Конечная дата: ср. 3 апреля 00:00:00 2019
2019-04-02 16: 17: 07.849870 + 0200 FollowMe[4891: 158214] Предикат: userEmail == "xxx" AND destinationTime> = CAST (575848800.000000, "NSDate") и flightTime <= CAST (575935200.000000, "NSDate") </p>

Хорошо, и вот яя в замешательстве.Во-первых, мне показывают слишком много событий, что неправильно.Но что меня больше всего смущает, так это эти CAST (...) временные метки.Если я преобразую 575935200.000000 в обычную дату, я получу 1 апреля 1988 года. Где моя ошибка в мысли?

...