You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel API或Flutter视图中转换yyyy-mm-ddthh:mm:ss.sssz格式时间

Laravel+Flutter开发中start_time时间格式转换及提交500错误解决方案

核心问题原因:Laravel默认将Eloquent模型的datetime字段序列化为ISO 8601格式(即你在Postman中看到的带T、Z后缀的格式),和SQL Server中存储的原生时间格式无关。你之前修改模型时间配置后触发500错误,通常是因为修改的配置同时作用于时间的读(序列化输出)和写(入库解析)逻辑,导致前端提交的时间格式无法匹配入库规则。

方案1:Laravel端统一处理(推荐,无需修改Flutter代码)

方式A:全局配置所有时间字段输出格式

该方案只会修改接口返回的时间序列化格式,不会影响写入逻辑,不会触发500错误:

  • 打开app/Providers/AppServiceProvider.php,在boot方法中添加如下代码:
use Illuminate\Support\Carbon;

public function boot()
{
    Carbon::serializeUsing(function ($carbon) {
        // 自定义需要的输出格式,此处为常用的年-月-日 时:分:秒
        return $carbon->format('Y-m-d H:i:s');
    });
}

方式B:仅针对start_time字段单独配置

如果只需要修改start_time这一个字段的格式,在对应模型中添加访问器+修改器即可,读写逻辑分离,不会冲突:

  • 加访问器控制接口输出格式:
public function getStartTimeAttribute($value)
{
    return \Carbon\Carbon::parse($value)->format('Y-m-d H:i:s');
}
  • 加修改器适配前端提交的时间格式,避免500错误:
public function setStartTimeAttribute($value)
{
    $this->attributes['start_time'] = \Carbon\Carbon::parse($value)->toDateTimeString();
}

方案2:Flutter端直接解析ISO 8601格式

如果不想修改后端代码,可以直接在Flutter层对拿到的时间字符串做格式化:

  • 示例代码(需添加intl依赖):
import 'package:intl/intl.dart';

String formatStartTime(String isoTimeStr) {
  // 解析ISO 8601格式字符串,如需转本地时间可追加.toLocal()
  DateTime dateTime = DateTime.parse(isoTimeStr);
  return DateFormat('yyyy-MM-dd HH:mm:ss').format(dateTime);
}

内容的提问来源于stack exchange,提问作者Preman Terminal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:12:01