…исследовал это в течение многих часов — и только становился все более и более запутанным!
Я на восточном побережье США.
Моя база данных размещена на сервере, который, кажется, находится на западном побережье.
Я могу сказать это, потому что, когда я вставляю новые данные в свою базу данных, скажем, в 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
объекты, которые я сравниваю, из разные часовые пояса.
Итак, как мне сделать так, чтобы они принадлежали к одному и тому же часовому поясу и провели правильное, достоверное сравнение?
Оператор 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.
Других решений пока нет …