【问题标题】:Laravel - different formats for date/time queryLaravel - 日期/时间查询的不同格式
【发布时间】:2021-03-27 22:21:49
【问题描述】:

我正在学习 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”吗? 感谢您的解决方案。

谢谢你的建议

【问题讨论】:

    标签: laravel datetime date-format date-formatting


    【解决方案1】:

    您应该使用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();
    

    您可以设置要转换的时区

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        感谢阿努拉特, 我在发送上一个问题后不久就意识到了这一事实。 ...但还有另一个“问题”——两次都是我的当地时间——“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 小时(作为我的时区偏移量)。哪里有问题? 谢谢。

        【讨论】:

          猜你喜欢
          • 2019-08-08
          • 2019-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          相关资源
          最近更新 更多