leancloud-php-library
leancloud-php-library copied to clipboard
Date 日期格式错误
https://ticket.avosapps.com/tickets/54991c9fe4b046c781270e4e/threads
问题解决如下: $return = array( "__type" => "Date", "iso" => date("c", strtotime($params." UTC")) );
把此处强制改为
$return = array( "__type" => "Date", "iso" => "2011-08-21T18:02:52.248Z" );
进行测试 Output: stdClass Object ( [createdAt] => 2014-12-23T08:55:45.687Z [objectId] => 54992e11e4b06783458b86ab )
创建成功,说明是日期格式生成函数错了。
现在需要修改日期生成函数到正确格式
c参数的意义 c ISO 8601 日期及时间(PHP 5 新加) 2004-02-12T15:19:21+00:00
由于 PHP 不支持到毫秒的时间,所以毫秒设置为 .000
涉及到 和 LeanCloud的时区转换 所以 减 8小时。
// 修改如下, date("Y-m-d\TH:i:s.000\Z", strtotime($params) - 3600*8)
Todo: 接收数据时候的 Date 转换 *8 能不能用 系统时区 和 leanCloud 之间的设置就行转换
我是这样解决的 首先,设置时区 //设置时区 date_default_timezone_set('PRC'); case 'date': $time = gmmktime($params[0], $params[1], $params[2], $params[3], $params[4], $params[5]); $return = array( "__type" => "Date", "iso" => gmdate('Y-m-d\TH:i:s.000\Z', $time) ); break;
调用: $startTime = array(0, 0, 0, $startM, $startD, $startY); $endTime = array(23, 59, 59, $endM, $endD, $endY); //查询条件 $query->whereGreaterThanOrEqualTo('updatedAt', $Location->dataType('date',$startTime)); $query->whereLessThanOrEqualTo('updatedAt', $Location->dataType('date',$endTime));
其实解决的办法都一样,必须依靠Y-m-d\TH:i:s.000\Z来获取结果
这个sdk还有一坑,比如上方的whereGreaterThanOrEqualTo()和whereLessThanOrEqualTo(),使用时会发现,只有后一个条件起作用了
解决办法,打开AVQuery.php 找到whereGreaterThanOrEqualTo方法 修改为: public function whereGreaterThanOrEqualTo($key,$value){ if(isset($key) && isset($value)){ $this->_query[$key] = empty($this->_query[$key]) ? array() : $this->_query[$key]; $this->_query[$key] += array( '$gte' => $value ); } else{ $this->throwError('the $key and $value parameters must be set when setting a "where" query method'); }
}
whereLessThanOrEqualTo方法也要修改
另外,吐槽一下写这个sdk的人,怎么连单引号和双引号都不分。。。。 $this->throwError('the $key and $value parameters must be set when setting a "where" query method'); 这样写 怎么可能打印出$key的值啊。。。 改为$this->throwError("the $key and $value parameters must be set when setting a 'where' query method");
在AV.php 添加这两个函数
// 把obj对象转换为数组
function JutransToArray($obj=''){
$array = array();
foreach ($obj as $field => $value) {
if(is_object($value)){
if ($value->__type == "Date") {
$array[$field] = JutransDate($value->iso);
}else{
$array[$field] = $value->iso;
}
}else{
$array[$field] = $value;
}
}
return $array;
}
// 日期转换
function JutransDate($date){
return date("Y-m-d\TH:i:s",strtotime($date)); // 需要与上文的 -3600*8 配合使用,不适用PRC,PRC经测试,还差了1个时区
}
谢谢,这个 sdk 是 fork 别人,然后修改的,我看看怎么将你的修改合并进去,thanks