Fatal error: Call to a member function format() on boolean passing in Wordpress ACF Datepicker to template

Fatal error: Call to a member function format() on boolean passing in Wordpress ACF Datepicker to template

这是我的代码:

$original_date = get_field('event_date');
$date = DateTime::createFromFormat('lFdY', strtotime($original_date));
$new_date = $date->format('l, F d, Y');

此代码位于短代码中的自定义 post 循环中,并在 Wordpress 管理员中调用。

我也试过没有 strtotime。我正在使用 PHP 5.6。 event_date 字段来自高级自定义字段日期选择器。

如果我只传递该字段,我会得到预期的输出(来自自定义 post 管理页面的输入),但没有空格和逗号。我也设置了这个,在 WP 的 acf 中保存和显示值。

这是错误:

Fatal error: Call to a member function format() on boolean on the line with $new_date variable.

那么如果我使用:

$date = date("l, F d, Y", strtotime($original_date));

循环为 post 的每个实例抛出一个错误,未定义的变量。

您应该将字符串直接传递给 createFromFormat 方法:

$date = DateTime::createFromFormat('lFdY', $original_date);

您收到的 boolean 是因为 createFromFormat 失败并返回 false

如果您仍然收到错误,get_field() 可能没有返回您认为的结果。

DateTime::createFromFormat returns false 如果无法使用指定的格式转换输入字符串。

在你的例子中,你正在使用 $original_date,将其转换为数字时间戳,并试图将其传递给 DateTime::createFromFormat,这是行不通的,因此错误。您需要改为传递原始日期:

$date = DateTime::createFromFormat('lFdY', $original_date);


PHP 目前无法解析该特定格式字符串。您可以通过一个应该 "obviously" 有效的简单案例来证明这一点。这个:

DateTime::createFromFormat('lFdY', date('lFdY', time()));

returnsfalse。该问题的具体原因是格式字符串中的 lF 之间以及输入字符串中的 day-of-week 和月份之间缺少 space。

您应该使用不同的日期格式。如果您可以删除 day-of-week 的文本表示(因为实际上没有必要消除日期的歧义),或者至少在 day-of-week 和月份之间得到一个 space,那将是最好的。

由于您的数据库中现有数据的格式无用,您可以编写一个相对简单的 pre-processor 来从输入字符串中删除 day-of-week:

$new_date = substr($original_date, strpos($original_date, 'y') + 1);
$date = DateTime::createFromFormat('FdY', $new_date);

(此示例始终采用小写的英文日期名称,并且输入始终有效。您的实际数据可能需要更复杂的代码。)


细节,细节: 当 PHP processes l 格式化程序(星期几)时,它需要查看以下字符之一:,;:/.-()、space、制表符或 end-of-string 作为停止阅读位置的指示。

因此,如果您的日期字符串是 FridayJuly082016,因为输入日期中没有任何 space,代码将继续读取 整个 字符串,然后失败,因为(字面上)FridayJuly082016 不在一周中的几天列表中。

不幸的是,对于您的特定情况,这也不太可能 "fixed"。您有一个非常不寻常的日期格式,并且在代码中使用这个特殊情况会使它变得相当复杂,对于一个有问题和罕见的用例。

尝试使用这个 .. <?php echo date('l, F d, Y', strtotime(get_field('event_date')));?> 它在我这边工作

Make sure your get_field('event_date') returns you the date in 20160113 format If not then change the return format from ACF setting in WP back-end.

@jbafford 我找到了解决方案。 首先,我在 ACF 日期选择器字段中将日期格式保存为 yymmdd

然后我用这段代码分别提取年月日然后格式化strtotime结果:

$odate = get_field('event_date');
$y = substr($odate, 0, 4); $m = substr($odate, 4, 2); $d = substr($odate, 6, 2);

$new_date = date('l, F j, Y', strtotime("{$d}-{$m}-{$y}"));

让我感到困惑并让我挂断电话的是我必须将 l 或日期传递到 strtotime 并且我必须将输入与预期的格式化输出相匹配的假设。 PHP date 不需要那么多信息来完成任务。感谢您的所有输入!