问题描述
我正在学习 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 小时(作为我的时区偏移量)。哪里有问题? 谢谢。