Skip to content

formatDateTime处理'datetime_format' => '\\app\\common\\util\\ModelDateTime'的问题 #603

Closed
@uniquekey-coder

Description

@uniquekey-coder
    /**
     * 时间日期字段格式化处理.
     *
     * @param mixed $format    日期格式
     * @param mixed $time      时间日期表达式
     * @param bool  $timestamp 时间表达式是否为时间戳
     *
     * @return mixed
     */
    protected function formatDateTime($format, $time = 'now', bool $timestamp = false)
    {
        if (empty($time)) {
            return $time;
        }

        if (false === $format) {
            return $time;
        } elseif (str_contains($format, '\\')) {
            //如果$format传递的是类,这里返回的是类实例化的对象?是否应该是 return (string)new $format($time);调用__toString()方法
            return new $format($time);
        }

        if ($time instanceof DateTimeInterface) {
            $dateTime = $time;
        } elseif ($timestamp) {
            $dateTime = new DateTime();
            $dateTime->setTimestamp(is_numeric($time) ? (int) $time : strtotime($time));
        } else {
            $dateTime = new DateTime($time);
        }

        return $dateTime->format($format);
    }

这里的代码是不是有问题,在数据库配置中, 'datetime_format' => '\app\common\util\ModelDateTime',我传递的类,最终返回的是一个对象。这应该是一个历史遗留问题,在thinkphp view视图中,使用的是 echo $object,会自动调用__toString(),但如果不是在view中,就不会调用__toString()了,所以 return new $format($time) 会得到结果 “{}”

           if (false === $format) {
            return $time;
        } elseif (str_contains($format, '\\')) {
            //如果$format传递的是类,这里返回的是类实例化的对象?是否应该是 return (string)new $format($time);调用__toString()方法
            return new $format($time);
        }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions