Преобразование и затем сравнение NSDates

…исследовал это в течение многих часов — и только становился все более и более запутанным!

Я на восточном побережье США.
Моя база данных размещена на сервере, который, кажется, находится на западном побережье.
Я могу сказать это, потому что, когда я вставляю новые данные в свою базу данных, скажем, в 9:45 моего времени (что опять же, время восточного побережья), когда я смотрю прямо в таблицу MySQL на сервере, он показывает данные как вставленные в 6:45 утра.

Проблема в том, что когда мое приложение считывает эту дату с сервера и сравнивает ее со своим последним сохраненным временем, это последнее сохраненное время всегда потом чем время последнего обновления с сервера.
Таким образом, любые новые данные, которые я вставляю на сервер, автоматически игнорируются, потому что они регистрируются как устаревшие данные (точнее, 3 часа назад).

Я перепробовал все виды конверсий, используя NSDateFormatter, NSTimeZone, NSLocale — и различные комбинации всех них, и я получаю суп из спагетти с мешаниной, который просто не работает.

Вот часть моего кода:

Код PHP — используется при вставке новых данных в базу данных MySQL:

// Declare a var for the date of insertion into the Database:
$storeItemDateAdded = date('Y-m-d H:i:s');
...
// Insert the new data into the database:
$stmt = $mysqli->prepare("INSERT INTO StoreTable (Name, Price, DateAdded)
VALUES ('". $newStoreItemName ."', '". $newStoreItemPrice ."', '".$storeItemDateAdded."');");

Код Objective-C

(Заметка:
-Объект JSON (NSDictionary), поступающий в приложение, показывает дату в следующем формате: 2015-03-29 06:45:30
-Поэтому я храню эту конкретную часть JSON в NSString Вар называется remoteDBStoreLastUpdateDate)

// Convert this String to an actual NSDate Object:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *liveStoreActualUpdateNSDate = [dateFormat dateFromString:remoteDBStoreLastUpdateDate];

// Now compare the Saved date and this new Remote date:
if ([storeSavedLastUpdateNSDate compare:liveStoreActualUpdateNSDate] == NSOrderedAscending) {
NSLog(@"Need to get FRESH STORE DATA!");
[self getNewData];
}
else {
NSLog(@"STORE is up to date!");
[self useSavedData];
}

Как я уже сказал, этот тест дает неправильные результаты — но не потому, что код / ​​логика неверен, а потому, что NSDate объекты, которые я сравниваю, из разные часовые пояса.
Итак, как мне сделать так, чтобы они принадлежали к одному и тому же часовому поясу и провели правильное, достоверное сравнение?

0

Решение

Оператор PHP
$storeItemDateAdded = date('Y-m-d H:i:s');
использует время сервера. Функция date () форматирует местная дата и время, и возвращает отформатированную строку даты.

затем

$stmt = $mysqli->prepare("INSERT INTO StoreTable (Name, Price, DateAdded) VALUES ('". $newStoreItemName ."', '". $newStoreItemPrice ."', '".$storeItemDateAdded."');");

вставляет локальную дату / время сервера в базу данных, а не дату / время, отправленные на сервер.

Отправьте дату / время на сервер, не полагайтесь на местное время сервера. Или используйте время UTC во всех системах, которое является внутренним хранилищем NSDate по умолчанию. Или добавьте смещение часового пояса к представлению строки времени.

Отправка времени на сервер означает получение времени на устройстве iOS, его правильное форматирование и передачу (отправку) на сервер вместе с отправляемыми данными. Затем на сервере, используя время, полученное из приложения, как время в операторе MySQL.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]