【问题标题】:Converting and then Comparing NSDates转换然后比较 NSDates
【发布时间】:2015-03-29 14:59:13
【问题描述】:

...研究了好几个小时 - 只是越来越困惑!

我在美国东海岸。
我的数据库由似乎位于西海岸的服务器托管。
我可以这样说,因为当我在上午 9:45 将新数据插入数据库时​​(同样是东海岸时间),当我直接查看服务器上的 MySQL 表时,它显示数据已插入早上 6 点 45 分。

问题是,当我的应用程序从服务器读取该日期并将其与自己的上次保存时间进行比较时,上次保存的时间总是比上次-来自服务器的更新时间。
因此,我插入服务器的任何新数据都会被自动忽略,因为它注册为旧数据(准确地说是 3 小时。)

我已经尝试使用NSDateFormatterNSTimeZoneNSLocale 以及所有这些的各种组合进行各种转换,但我得到的意大利面杂烩汤不起作用。

这是我的一些代码:

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 的这一特定部分存储在一个名为 remoteDBStoreLastUpdateDateNSString 变量中)

// 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


【解决方案1】:

PHP 声明
$storeItemDateAdded = date('Y-m-d H:i:s');
正在使用服务器时间。 date() 函数格式化本地日期和时间,并返回格式化的日期字符串。

然后

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

在数据库中插入服务器本地日期/时间,而不是发送到服务器的日期/时间。

将日期/时间发送到服务器,不要依赖服务器的本地时间。或者在默认 NSDate 内部存储的所有系统上使用 UTC 时间。或者将时区偏移量添加到时间字符串表示中。

将时间发送到服务器意味着获取iOS设备上的时间,正确格式化并将其与正在发送的数据一起传输(发送)到服务器。然后在服务器上使用从应用程序接收到的时间作为 MySQL 语句中的时间。

【讨论】:

  • 好吧,很有趣 - 我不知道整个 PHP date() 的事情以及它到底在做什么。我实际上并不了解 PHP(你能告诉我吗?)我有点通过谷歌搜索来拼凑东西......因为老板 - 在他无限的智慧中 - 决定我是这份工作的人:-) 好时光。似乎有多种选择可以解决整个时区业务 - 我会探索并回复您。
  • 我在我的 PHP 文件顶部添加了以下内容:date_default_timezone_set('EST'); 及其几乎正常工作。它现在关闭了 1 小时。 - 因为夏令时。接下来我尝试将EST 更改为DSTEDT,但两者都没有。东部夏令时没有PHP代码吗?
  • 最好的选择仍然是 UTC,这对于另一个时区的用户来说如何工作,比如 PDT?夏令时在欧洲的不同日期会发生变化,在美国的几个州没有变化,在世界大部分地区也不存在。此外,NSDate 内部使用 UTC(他们称之为 GMT)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2016-05-22
  • 2013-01-19
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多