【发布时间】:2015-03-29 14:59:13
【问题描述】:
...研究了好几个小时 - 只是越来越困惑!
我在美国东海岸。
我的数据库由似乎位于西海岸的服务器托管。
我可以这样说,因为当我在上午 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 代码
(注意:
- 进入 App 的 JSON 对象(NSDictionary)以这种格式显示日期:2015-03-29 06:45:30
- 因此,我将 JSON 的这一特定部分存储在一个名为 remoteDBStoreLastUpdateDate 的 NSString 变量中)
// 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 对象来自不同 时区。
那么如何让它们处于同一时区并进行真实有效的比较呢?
【问题讨论】:
-
你应该看看这个答案:stackoverflow.com/a/18124778/4716039
-
将日期/时间发送到服务器,不要依赖服务器的本地时间。或者在默认 NSDate 内部存储的所有系统上使用 UTC 时间。或者将时区偏移量添加到时间字符串表示中。
-
@Zaph - 我以为我正在将日期/时间发送到服务器。这不是 PHP 脚本(我在我的问题中包含)在做什么吗?它声明了一个捕获日期的变量:
$storeItemDateAdded = date('Y-m-d H:i:s');然后我在我的 SQL 语句中使用该变量:INSERT INTO StoreTable (Name, Price, ... DateAdded) VALUES ('". $newStoreItemName ."', '". $newStoreItemPrice ."',.... '".$storeItemDateAdded."');这就是将日期/时间发送到服务器。
标签: php ios objective-c nsdate nsdateformatter