微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel - 日期/时间查询的不同格式

如何解决Laravel - 日期/时间查询的不同格式

我正在学习 Laravel,但我在控制器上遇到了一些小问题 - 当我使用 DB 时,查询返回没有时区的日期时间,但如果我使用模型,则查询返回完整的日期时间。

    public function test($switch)
    {
        //return "YYYY-MM-DDThh:mm:ss.000000Z"
        if ($switch) return Position::select('id','created_at')->orderBy('id')->get();

        // return "YYYY-MM-DD hh:mm:ss"
        return DB::table('positions')->select('id','created_at')->orderBy('id')->get();
    }

为什么?在这两种情况下,我都需要“YYYY-MM-DDThh:mm:ss.000000Z”吗? 感谢您的解决

谢谢指教

解决方法

您应该使用 DB::raw

以下语句会将日期时间值 created_at 从 +00:00 时区转换为 +10:00 时区。

你可以试试这个

return DB::table('positions')->select(DB::raw('id',CONVERT_TZ('created_at','+00:00','+10:00'))->orderBy('id')->get();

您可以设置要转换的时区

,

它们是相同的数据,可能只是日期的不同类别,您可以随时格式化日期。 Laravel 使用的 Carbon 日期库非常好,应该主要使用。

如果您尝试使用 get_class() 为 Eloquent Position created_at 打印日期类,您可能得到了 Carbon 和 DB::table('positions') created_at,您可能得到了 DateTime,这就是值看起来不同的原因(但你仍然得到相同的日期)。

如果您想将 DateTime 转换为 Carbon,您可以这样做

$newDate = new \Carbon\Carbon($position->created_at)
,

谢谢阿努拉特, 我在发送上一个问题后不久就意识到了这一事实。 ...但还有另一个“问题” - 两次都是我的当地时间 - “YYYY-MM-DDThh:mm:ss.000000Z”中的时间不是我预期的 UTC 时间。

我改变了我的功能:

    public function test($switch = false)
    {
        $data = Position::selectRaw('id,created_at,UNIX_TIMESTAMP(created_at) unix')->orderBy('id')->get();
        
        foreach ($data as $d) {
            $conv = new \DateTime($d->created_at);
            $d->conv = intval($conv->format('U'));
            $d->diff = $d->conv - $d->unix;
            }
        return $data;
    }

...结果是

    
0   
  id             1
  created_at    "2021-03-18T12:36:59.000000Z"
  unix          1616067419
  conv          1616071019
  diff          3600

如您所见,差异为 1 小时(作为我的时区偏移量)。哪里有问题? 谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。