PHP/MySQL 和 iOS 的非常奇怪的日期行为

Very weird Date behaviour by PHP/MySQL and iOS

我正在将我的 Android 应用程序移植到 iOS,我正处于聊天阶段。

每条消息都有自己的日期,我的服务器 API(在 PHP 中)有一个方法可以获取自某个日期以来的所有消息(因此我可以使用我的 lastMessageDate 并在需要时获取设备上没有的任何新消息)

我的数据库是 MySQL,服务器的时区是 GMT+2。数据库将所有日期保存为 GMT+2,并且 PHP 将它们作为字符串发送回客户端。

在 Android 和我用于测试的 REST 客户端中,调用以下请求会给出 "No new messages" 消息,因为它应该:

在 iOS 中,由于 OS 将所有日期转换为 UTC,因此在发送日期之前,我将其转换为 GMT+2 字符串。我一直在测试和调试这个日期字符串,它确实是 GMT+2,正如我的服务器所期望的那样。 在发送请求之前用调试器打印 POST 参数,表明时间确实是 GMT+2:

Params: ["since": "2017-03-15 21:16:04", "chat_id": "86", "username": "testuser"]

但是,发送与我的 REST 客户端完全相同的请求,returns 过去 2 小时内发布的聊天消息,就像 iOS 应用程序发送的是 UTC 日期一样我的 GMT+2 字符串。

iOS 模拟器中的响应如下:

Received data is: 
{
  "message" : "Messages in this chat:",
  "messages" : [
    {
      "message" : "This is a message",
      "chat_id" : "86",
      "who" : "1",
      "date" : "2017-03-15 21:16:04"
    }
  ],
  "error" : false
}

过去 4 小时我一直在尝试调试它,但没有成功。我不知道这是服务器的错误还是 iOS' 的错误,所以如果有人能指出正确的方向,我将不胜感激。谢谢

原来我需要使用 Alamofire.URLEncoding.httpBody 而不是 Alamofire.JSONEncoding.default 对请求进行编码,以便 PHP 能够使用 isset($_POST["since"]) 检查参数。我以前没有遇到过这个问题,在我的应用使用 Alamofire.JSONEncoding.default.

编码的其他 40 个 API 调用中

如果有人可以解释什么时候最好使用 URLEncoding 进行编码以及什么时候使用 JSONEncoding,请告诉我。

感谢所有试图提供帮助的人!