Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
uniquekey-coder opened this issue Aug 8, 2024 · 6 comments

Comments

@uniquekey-coder
Copy link

uniquekey-coder commented Aug 8, 2024

    /**
     * 时间日期字段格式化处理.
     *
     * @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);
        }
@yunwuxin
Copy link
Member

yunwuxin commented Nov 7, 2024

设计如此 返回对象是为了方便你在输出时调用这个对象的方法来输出不同的格式

@wintrue
Copy link

wintrue commented Nov 7, 2024

设计如此 返回对象是为了方便你在输出时调用这个对象的方法来输出不同的格式

这样吗?在thinkphp的database.php配置中,如果设置'datetime_format' => '\app\common\util\ModelDateTime', 在哪里调用 这个对象的方法来输出,好像这里的这个转换是tp自动 完成的?

@yunwuxin
Copy link
Member

yunwuxin commented Nov 7, 2024

任何你用到这个字段的地方 比如你模板里可以调用 user->create_time->fromNow() 或者 user->create_time->format('xxxx') 只是直接转字符串时有个默认的格式而已

@wintrue
Copy link

wintrue commented Nov 7, 2024

任何你用到这个字段的地方 比如你模板里可以调用 user->create_time->fromNow() 或者 user->create_time->format('xxxx') 只是直接转字符串时有个默认的格式而已

感谢,但是如果是api项目,就得每次再转换这个create_time,如果'datetime_format' => 'Y-m-d H:i:s'这样设置,就会得到Y-m-d H:i:s 这样的格式的结果,如果设置为格式化类'datetime_format' => '\app\common\util\ModelDateTime'就要二次format ..

@yunwuxin
Copy link
Member

yunwuxin commented Nov 7, 2024

你的ModelDateTime实现下 JsonSerializable就可以了 可以在api json_encode输出的时候自动转成你想要的格式

@wintrue
Copy link

wintrue commented Nov 7, 2024

你的ModelDateTime实现下 JsonSerializable就可以了 可以在api json_encode输出的时候自动转成你想要的格式

感谢大佬!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants