Laravel 5.8中如何将特定GMT格式日期转为MySQL时间戳?
解决Laravel中日期字符串转MySQL格式的问题
嘿,我来帮你搞定这个日期转换的事儿!你收到的这种带时区的英文日期字符串,用Laravel自带的Carbon扩展处理最省心了,不用自己写复杂的正则或者转换逻辑。
步骤1:确保引入Carbon
首先,在你的控制器顶部引入Carbon(如果还没加的话):
use Carbon\Carbon;
步骤2:转换日期格式
Carbon的parse()方法能完美识别你收到的这种Thu Apr 11 2019 00:00:00 GMT+0200格式的字符串,然后你可以直接转成MySQL能识别的格式:
转成MySQL Datetime格式(推荐,适配大多数场景)
这种格式会生成2019-04-11 00:00:00,完全匹配MySQL的datetime/timestamp字段要求:
$start = Carbon::parse($request->input('start'))->toDateTimeString(); $end = Carbon::parse($request->input('end'))->toDateTimeString();
转成时间戳(如果你的字段是整数类型的时间戳)
直接获取时间戳整数,也能被MySQL正常识别:
$start = Carbon::parse($request->input('start'))->timestamp; $end = Carbon::parse($request->input('end'))->timestamp;
步骤3:修正代码里的小细节(可选但重要)
我注意到你代码里写的是whereBetween('created_a', ...),大概率是笔误,应该是created_at吧?记得修正这个字段名,不然查询会报错。另外,用Laravel集合的transform()方法代替for循环会更优雅简洁:
修改后的完整代码
use Carbon\Carbon; public function getAll(Request $request){ // 转换请求中的日期格式 $start = Carbon::parse($request->input('start'))->toDateTimeString(); $end = Carbon::parse($request->input('end'))->toDateTimeString(); // 查询销售数据,修正字段名并关联关联模型 $sales = Sale::with('SaleLine.lens','SaleLine.cadre','cli_sale') ->whereBetween('created_at', [$start, $end]) ->orderBy('id', 'desc')->get(); // 用集合方法生成客户姓名,替代传统for循环 $sales->transform(function ($sale) { $sale['client_name'] = $sale['cli_sale']['first_name'] . " " . $sale['cli_sale']['last_name']; return $sale; }); return response()->success(['sales'=>$sales]); }
额外提示:时区处理
如果你的数据库时区和请求里的时区不一致(比如数据库用UTC),可以在转换时转成对应时区,避免时间偏差:
$start = Carbon::parse($request->input('start'))->utc()->toDateTimeString();
另外,要是担心日期格式无效,可以加个简单的校验:
$startStr = $request->input('start'); if (!Carbon::canParse($startStr)) { return response()->error('无效的开始日期格式'); } $start = Carbon::parse($startStr)->toDateTimeString();
内容的提问来源于stack exchange,提问作者Khalid CHBAB
相关产品推荐
相关产品推荐

