......一直在研究这个问题 - 而且只是越来越困惑!
我在美国东海岸
我的数据库由一个似乎位于西海岸的服务器托管
我可以告诉这个,因为当我在我的数据库中插入新数据时,比如我的时间上午9:45(再次是东海岸时间),当我直接查看服务器上的MySQL表时,它显示数据已插入上午6:45。
问题是,当我的应用程序从服务器读取该日期并将其与自己上次保存的时间进行比较时,最后节省的时间总是 以后 而不是最后一次 - 来自服务器的更新时间
因此,我插入到服务器中的任何新数据都会被自动忽略,因为它注册的数据是旧的(确切地说是3小时)。
我已尝试使用NSDateFormatter
,NSTimeZone
,NSLocale
以及所有这些转换的各种组合进行各种转换,而且我得到了意大利面条混合汤#39;工作。
这是我的一些代码:
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
的{{1}} var中
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];
}
个对象来自 不同< / em> 时区。
那么如何让它们成为相同的时区并进行真正有效的比较呢?
答案 0 :(得分:1)
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语句中的时间。