【问题标题】:laravel does not recognize ISO8601 formatted date timelaravel 无法识别 ISO8601 格式的日期时间
【发布时间】:2018-06-11 00:56:27
【问题描述】:

假设我们有一个来自 angularJs 客户端应用程序的2015-02-05T14:50:55+01:00 格式化日期时间。

现在我想将它作为DATETIME MySQL 保存在一个表中。

我知道这是iso 8601 格式化的日期时间。因此,我在模型中添加了以下代码:

protected $dateFormat = 'DATE_ISO8601';

但是当我想用这个新字段更新我的模型时,我收到了这个错误:

A textual day could not be found
Meridian can only come after an hour has been found
The format separator does not match
The format separator does not match
The format separator does not match
The timezone could not be found in the database
Data missing {"userId":1,"email":"ahmadbadpey@gmail.com","exception":"[object] (InvalidArgumentException(code: 0): A textual day could not be found
Meridian can only come after an hour has been found
The format separator does not match
The format separator does not match
The format separator does not match
The timezone could not be found in the database
Data missing at D:\\wamp\\www\\zarsystem\\vendor\
esbot\\carbon\\src\\Carbon\\Carbon.php:582)
[stacktrace]
#0 D:\\wamp\\www\\zarsystem\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(715): Carbon\\Carbon::createFromFormat('DATE_ISO8601', '2015-02-05T14:5...')

我尝试了一些其他的预定义常量,例如 DATE_ATOM,DATE_W3C ,...但得到了同样的错误。

我很困惑,我不知道该怎么办?

【问题讨论】:

  • 您的时间戳不是有效的 MySQL datetime (see here)。

标签: php mysql angularjs laravel laravel-5.5


【解决方案1】:

您可以这样做:

protected $dateFormat = 'c';

c 是 ISO 8601 日期。

http://php.net/manual/en/function.date.php

另外,我相信这不是您想要的,因为您之前说过您希望将日期以标准格式保存在数据库中,即Y-m-d H:i:s

因此,您应该在从 DB 中获取日期后添加 an accessor 来转换日期,并在将日期保存到 DB 之前添加 a mutator 以从 ISO 8601 转换回 Y-m-d H:i:s

默认情况下,时间戳的格式为“Y-m-d H:i:s”。如果您需要自定义时间戳格式,请在模型上设置 $dateFormat 属性。该属性决定日期属性在数据库中的存储方式,以及模型序列化为数组或 JSON 时的格式

https://laravel.com/docs/5.5/eloquent-mutators#date-mutators

【讨论】:

  • 我试过protected $dateFormat = 'c';,但我得到了这个错误:The format separator does not match.......D:\\wamp\\www\\zarsystem\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(715): Carbon\\Carbon::createFromFormat('c', '2015-02-05T14:5...')
  • @A.B.Developer 那么,您真的想以这种格式保存它吗?你说过你需要这个日期只是因为你的前端开发人员要求它。如果是这种情况,您真的只想创建一个访问器和一个修改器。如果您仍想这样做,请使用this dirty fix
  • 我有很多日期字段,例如 created_atupdated_atbirthday_datewedding_date 并且我成功地将日期时间作为 ISO 8601 发送到客户端,而它确实保存为正常日期-time MySQL 格式。现在,当客户端再次以iso 发送日期时,我必须将其更改为 MySQL 日期时间格式并保存。我不想为每个字段编写访问器和修改器,并希望 laravel 自动完成。
  • @A.B.Developer 感谢您的解释。如果你想保持你的代码可维护,你真的应该使用访问器和修改器。如果不重要,请使用我在上一条评论中显示的脏修复。
  • 这不起作用,因为 Carbon 使用 DateTime::createFromFormat(),它不支持 c
【解决方案2】:

DATE_ISO8601 是一个常量,在DateTime 类中定义,您尝试使用格式掩码字符串'DATE_ISO8601'

你应该可以的

protected $dateFormat = \DateTime::DATE_ISO8601;

但是,这种格式与 ISO-8601 不兼容,但出于向后兼容的原因,保留这种格式;所以最好使用ATOM常量

protected $dateFormat = \DateTime::ATOM;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多