Php 致命错误:在将Wordpress ACF Datepicker传入模板时调用成员函数format()

Php 致命错误:在将Wordpress ACF Datepicker传入模板时调用成员函数format(),php,wordpress,date,datepicker,advanced-custom-fields,Php,Wordpress,Date,Datepicker,Advanced Custom Fields,这是我的密码: $original_date = get_field('event_date'); $date = DateTime::createFromFormat('lFdY', strtotime($original_date)); $new_date = $date->format('l, F d, Y'); 此代码位于一个快捷码中的自定义post循环中,并在Wordpress管理员中调用 我也尝试过不使用strotime。我使用的是PHP5.6。 event_date字段来自

这是我的密码:

$original_date = get_field('event_date');
$date = DateTime::createFromFormat('lFdY', strtotime($original_date));
$new_date = $date->format('l, F d, Y');
此代码位于一个快捷码中的自定义post循环中,并在Wordpress管理员中调用

我也尝试过不使用strotime。我使用的是PHP5.6。
event_date
字段来自高级自定义字段日期选择器

如果我只是通过这个字段,我就得到了我想要的输出(来自自定义post admin页面的输入),但是没有空格和逗号。我也在WP中设置、保存和显示acf中的值

这就是错误:

致命错误:对行上的布尔值调用成员函数format() 使用$new_日期变量

如果我使用:

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

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

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

$date = DateTime::createFromFormat('lFdY', $original_date);
您收到的
boolean
是因为
createFromFormat
失败并返回
false

如果您仍然收到错误,
get_field()
可能不会返回您认为是的内容。

如果无法使用指定的格式转换输入字符串,则返回
false

在您的例子中,您正在获取一个
$original_date
,将其转换为一个数字时间戳,并尝试将其传递到
DateTime::createFromFormat
,但该操作将不起作用,因此出现错误。您需要输入原始日期:

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

PHP目前无法解析该特定格式字符串。你可以用一个简单的案例来证明这一点,这个案例“显然”是可行的。这:

DateTime::createFromFormat('lFdY', date('lFdY', time()));
返回
false
。问题的具体原因是格式字符串中的
l
F
之间以及输入字符串中的星期和月份之间缺少空格

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

由于数据库中现有数据的格式没有帮助,因此可以编写一个相对简单的预处理器,从输入字符串中删除星期几:

$new_date = substr($original_date, strpos($original_date, 'y') + 1);
$date = DateTime::createFromFormat('FdY', $new_date);
(本例假设始终使用英文日期名称(小写),且输入始终有效。实际数据可能需要更复杂的代码。)


具体细节:当PHP调用
l
格式设置程序(星期几)时,需要看到以下字符之一:
,;:/-()
,一个空格、制表符或字符串结尾,用于指示停止读取的位置

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

不幸的是,对于您的特殊情况,这也不太可能是“固定的”。您有一个非常不寻常的日期格式,如果在代码中使用这个特殊的用例,那么对于一个有问题且罕见的用例来说,它将变得相当复杂。

尝试使用这个<代码>它在我这边工作

确保您的
get_字段(“事件日期”)
20160113
格式中向您返回日期,如果没有,则从WP后端的ACF设置更改返回格式


@我找到了一个解决方案。 首先,我在ACF datepicker字段中将日期格式保存为yymmdd

然后,我使用此代码分别提取年、月和日期,然后格式化strotime结果:

$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或一天传递到strotime,并且必须将输入与预期的格式化输出相匹配。PHP date不需要那么多信息来完成任务。谢谢你的所有意见

使用这行代码返回Unix开始时间:1970年1月1日,星期四,当我将$original_date作为$original_date=get_字段('event_date')回显时;使用代码行$new_date=date(“l,fd,Y”,strottime(get_字段('event_date'));返回Unix开始时间:1970年1月1日,星期四,当我将$original_date作为$original_date=get_字段('event_date')回显时;我得到了预定的日期,2016年7月8日星期五,没有我要找的格式。似乎日期方法正在替换输入。我的保存格式是DDmmddyy,我的显示格式是DD,MM DD,yy。您的ACF版本是什么?我有4.4.5,但我没有选择显示和保存的单选按钮(不像你的那样返回),只有一个输入字段。好的,在这种情况下,你应该尝试更新acf的版本。。请首先导出在当前acf中创建的所有自定义字段,此外,如果导入acf xml不起作用,请备份数据库。我安装的版本4.4.5是最新版本。并且@rnevius$date=DateTime::createFromFormat('lFdY',$original_date);$new_date=$date->format('l,F,d,Y');仍然返回相同的布尔值error@ardev您试图使用的
$original\u date
是什么?“$original\u date=get\u字段('event\u date');”这是我的ACF日期选择器字段的字段名。当我简单地回显“$original_date”时,我会得到每个自定义帖子类型的输入,但没有格式,也就是我在ACF配置中设置的格式。是的,但是,实际值是多少?如果日期与您指定的格式不匹配,那么它将不起作用。哦,好吧,因为它是一个循环,当然,每个自定义帖子类型的条目的日期都会有所不同。这是我回显“$original_date”时返回的结果:FridayJuly082016SundayFebruary072016MondayFebruary012016这是我所期望的,除了空格和逗号是strippe