【问题标题】:What is the correct date format for the following date example: "2018-06-06 14:03:57.973468 +00:00"以下日期示例的正确日期格式是什么:“2018-06-06 14:03:57.973468 +00:00”
【发布时间】:2019-05-14 21:18:33
【问题描述】:

我正在使用 PHP 和 laravel nova 在数据库中创建我的模型。我的数据库已经有了它的数据,但是我在从日期类型的列中插入值时遇到了一些问题。

我的数据库是一个 pgsql,它以这种格式存储日期:2018-06-06 14:03:57.973468 +00:00

但是当我尝试在我的 via Laravel nova admin 中创建一行时,它会尝试插入以下日期格式:2018-12-22 14:00:00+

日期格式缺少毫秒和时区,我想知道我必须在$dateFormat 变量中设置的女巫日期格式:

protected $dateFormat = 'Y-m-d H:i:s+';

public function getDateFormat()
{
    return 'Y-m-d H:i:s+';
}

正如您在代码中看到的那样,我使用的是Y-m-d H:i:s+ 格式,但它仅在我从数据库中获取日期时才有效,当我尝试插入一行时,它会返回以下错误:

SQLSTATE[22007]: Invalid datetime format: 7 ERROR:  invalid input syntax for type timestamp with time zone: "2018-12-21 14:00:00+" (SQL: insert into "offer" ("column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "column_name", "created_at") values (, , , , , , , , , , , , , , , , , 2018-12-21 14:00:00+, 2018-12-22 14:00:00+, 283, 2018-12-13 15:44:03+, 2018-12-13 15:44:03+) returning "id")

编辑 1

我将日期格式更新为Y-m-d H:i:s.u P,错误发生了变化。我使用以下函数检查日期和日期格式是否匹配:

function validateDate($date, $format = 'Y-m-d H:i:s.u P')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

validateDate('2018-06-06 14:03:57.973468 +00:00'); // => true
validateDate('2018-06-06 14:03:57.973468 +00:0022'); // => false

并且错误变为Unexpected data found. Data missing

【问题讨论】:

标签: php laravel date timestamp laravel-nova


【解决方案1】:

就像你在使用 Laravel 一样,尝试使用 Carbon 来处理它。

修补程序示例。

>>> use Carbon\Carbon;
>>> $date = Carbon::parse('2018-06-06 14:03:57.973468 +00:00');
=> Carbon\Carbon @1528293837 {#3039
     date: 2018-06-06 14:03:57.973468 +00:00,
   }
>>> $date->format('Y-m-d H:i:s');
=> "2018-06-06 14:03:57"

同时删除+ 符号,因为您没有以时间格式传递时区。

【讨论】:

  • laravel 默认使用 carbon 来格式化声明的日期字段,例如 created_at & updated_at
  • @YagoAzedias 你说的日期格式是什么意思?当您这样做$date->format('Y-m-d H:i:s'); 时,您提供的字符串具有您想要的格式'Y-m-d H:i:s',尽管当您执行$date = Carbon::parse('somedate'); 时,您可以调用多种可用的ISO 或RFC 格式$date->toIso8601String(); carbon.nesbot.com/docs/#api-commonformats
【解决方案2】:

使用Y-m-d H:i:s P 格式。

protected $dateFormat = 'Y-m-d H:i:s P';

public function getDateFormat()
{
    return 'Y-m-d H:i:s P';
}

你可以在http://php.net/manual/en/function.date.php上查看所有可用的格式

【讨论】:

  • 我试过但似乎也不起作用,因为我在链接“c”格式中看到的日期是这样的:2004-02-12T15:19:21+00:00 但我的情况不同:2018-06-06 14:03:57.973468 +00:00跨度>
  • 我更新了我的答案。你只需要_P 在你从一开始就有的格式之后
  • 在这种情况下,我得到了The timezone could not be found in the database。也许我还必须设置毫秒?
  • 这与毫秒无关。您如何在数据库中设置数据?你用的是雄辩的方法还是你自己的?
  • 就像我说的:“我的数据库是一个 pgsql,它以这种格式存储日期:2018-06-06 14:03:57.973468 +00:00”加上列的类型是“带有时区的时间戳"
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多