【问题标题】:CakePHP 3 - Comparing and modifying datesCakePHP 3 - 比较和修改日期
【发布时间】:2017-03-30 07:07:30
【问题描述】:

CakePHP 3 Cookbook on Date/Time 中,您可以使用 IsWithinNext/WasWithinNext 将时间间隔与未来/过去几天/几周进行比较。您还可以通过执行 ->modify('extra time') 来修改日期/时间 - 例如。如果 $date = 2016-01-01,$date->modify('+1 week') 将意味着 $date = 2016-01-08。

这些功能需要使用 Cake\i18n\Time。但是,当我尝试使用这些功能时,我收到了 Cake 错误:

在字符串上调用成员函数 isWithinNext()。

这是我使用的代码:

$date_start = \Cake\Database\Type::build('date')->marshal($data['session']['date_start'])->i18nFormat(); //before hand my dates were in the form of an array comprised of Year, Month and Day. This changes them into date format.
if($date_start->isWithinNext('1 week')){
    $deposit_due = $booking->date_confirm;
    $deposit_due->modify('+48 hours');
} elseif ($date_start->isWithinNext('2 weeks')){
    $deposit_due = $booking->date_confirm;
    $deposit_due->modify('+1 week');
} elseif ($date_start->isWithinNext('3 weeks')){
    $deposit_due = $booking->date_confirm;
    $deposit_due->modify('+1 week');
} else {
    $deposit_due = $booking->date_confirm;
    $deposit_due->modify('+2 weeks');
}

【问题讨论】:

  • 错误信息非常简单,$date_start 是一个字符串,而不是一个对象。仔细查看您的代码,您在构造的日期对象上调用 i18nFormat()
  • 哦,没有意识到 i18nFormat() 使其可打印将其变成了字符串。谢谢。
  • 谢谢@burzum。这是一个非常有用的参考。
  • 顺便说一句@ndm,date('Y-m-d H:i:s', Time::now()->getTimestamp()); 已经是日期对象了吗?我尝试在设置为该变量的变量上使用\Cake\Database\Type::build('date')->marshal(),但我得到了字符串错误,而最初是数组并被转换的变量没有问题。

标签: date cakephp time cakephp-3.0


【解决方案1】:

调用 i18nFormat() 会返回一个格式化字符串,您可以在 API 中查找:https://api.cakephp.org/3.4/class-Cake.I18n.DateFormatTrait.html#_i18nFormat

例如,这应该可以工作:

$date_start = new \Cake\I18n\Time($data['session']['date_start']);
debug($date_start->isWithinNext('2 weeks'));

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多