转换然后比较 NSDates
Converting and then Comparing NSDates
...为此研究了几个小时 - 只是越来越困惑!
我在美国东海岸。
我的数据库由似乎在西海岸的服务器托管。
我可以这么说,因为当我在 9:45am 我的时间(同样是东海岸时间)将新数据插入我的数据库时,当我直接查看 MySQL table服务器,它显示数据已插入 6:45am.
问题是,当我的应用程序从服务器读取该日期并将其与自己上次保存的时间进行比较时,上次保存的时间始终是 later 比来自服务器的最后更新时间。
所以我插入服务器的任何新数据都会被自动忽略,因为它注册为旧数据(准确地说是 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 的这个特定部分存储在一个名为 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];
}
所以就像我说的,这个测试产生了错误的结果 - 但不是因为 code/logic 是错误的,而是因为我正在比较的 NSDate
对象来自 不同时区。
那么如何让它们处于同一时区并进行真实有效的比较呢?
PHP 语句
$storeItemDateAdded = date('Y-m-d H:i:s');
正在使用服务器时间。 date() 函数格式化 本地日期和时间 ,returns 格式化日期字符串。
然后
$stmt = $mysqli->prepare("INSERT INTO StoreTable (Name, Price, DateAdded) VALUES ('". $newStoreItemName ."', '". $newStoreItemPrice ."', '".$storeItemDateAdded."');");
将服务器本地 date/time 插入数据库,而不是 date/tine 发送到服务器。
发送date/time到服务器,不依赖服务器本地时间。或者在所有系统上使用 UTC 时间,这是默认的 NSDate 内部存储。或者将时区偏移量添加到时间字符串表示中。
将时间发送到服务器是指在iOS设备上获取时间,正确格式化并将其与发送的数据一起传输(发送)到服务器。然后在服务器上使用从应用程序接收到的时间作为 MySQL 语句中的时间。
...为此研究了几个小时 - 只是越来越困惑!
我在美国东海岸。
我的数据库由似乎在西海岸的服务器托管。
我可以这么说,因为当我在 9:45am 我的时间(同样是东海岸时间)将新数据插入我的数据库时,当我直接查看 MySQL table服务器,它显示数据已插入 6:45am.
问题是,当我的应用程序从服务器读取该日期并将其与自己上次保存的时间进行比较时,上次保存的时间始终是 later 比来自服务器的最后更新时间。
所以我插入服务器的任何新数据都会被自动忽略,因为它注册为旧数据(准确地说是 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 的这个特定部分存储在一个名为 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];
}
所以就像我说的,这个测试产生了错误的结果 - 但不是因为 code/logic 是错误的,而是因为我正在比较的 NSDate
对象来自 不同时区。
那么如何让它们处于同一时区并进行真实有效的比较呢?
PHP 语句
$storeItemDateAdded = date('Y-m-d H:i:s');
正在使用服务器时间。 date() 函数格式化 本地日期和时间 ,returns 格式化日期字符串。
然后
$stmt = $mysqli->prepare("INSERT INTO StoreTable (Name, Price, DateAdded) VALUES ('". $newStoreItemName ."', '". $newStoreItemPrice ."', '".$storeItemDateAdded."');");
将服务器本地 date/time 插入数据库,而不是 date/tine 发送到服务器。
发送date/time到服务器,不依赖服务器本地时间。或者在所有系统上使用 UTC 时间,这是默认的 NSDate 内部存储。或者将时区偏移量添加到时间字符串表示中。
将时间发送到服务器是指在iOS设备上获取时间,正确格式化并将其与发送的数据一起传输(发送)到服务器。然后在服务器上使用从应用程序接收到的时间作为 MySQL 语句中的时间。