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,请告诉我。
感谢所有试图提供帮助的人!
我正在将我的 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
.
如果有人可以解释什么时候最好使用 URLEncoding 进行编码以及什么时候使用 JSONEncoding,请告诉我。
感谢所有试图提供帮助的人!