leancloud-php-library icon indicating copy to clipboard operation
leancloud-php-library copied to clipboard

Date 日期格式错误

Open killme2008 opened this issue 10 years ago • 5 comments

https://ticket.avosapps.com/tickets/54991c9fe4b046c781270e4e/threads

killme2008 avatar Dec 23 '14 09:12 killme2008

问题解决如下: $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 之间的设置就行转换

plusmancn avatar Dec 23 '14 09:12 plusmancn

我是这样解决的 首先,设置时区 //设置时区 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来获取结果

lly835 avatar Dec 23 '14 12:12 lly835

这个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");

lly835 avatar Dec 23 '14 12:12 lly835

在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个时区
}

plusmancn avatar Dec 23 '14 14:12 plusmancn

谢谢,这个 sdk 是 fork 别人,然后修改的,我看看怎么将你的修改合并进去,thanks

killme2008 avatar Dec 26 '14 04:12 killme2008