树枝日期时间过滤器,如果午夜隐藏时间


Twig datetime filter to hide time if midnight

给定某个日期值,我想使用 Twig 以某种给定格式显示日期。 http://twig.sensiolabs.org/doc/filters/date.html 提供了大部分此功能。

现在,我想向前迈出一步,如果somedate正好等于2015-01-21 00:00:00(即午夜),则不显示时间,而只显示日期。

我想出了一个部分解决方案,其中{{ somedate|datetime(true) }}用于显示可能以秒为单位的日期时间,但是,我的解决方案很弱,因为格式无法修改。

$twig->addFilter(new Twig_SimpleFilter('datetime', function ($d,$s=null) {
    $f='m/d/Y'.((strlen($d)==19 && substr($d, -8)!='00:00:00')?' g:i'.(($s)?':s':null).' A':null);
    $date = new DateTime($d);
    return $date->format($f);
}));

我想修改过滤器,以便提供一种格式,例如 {{ data.bid_date|datetime("m/d/Y g:i A") }} ,并且日期时间使用给定格式显示,除非是午夜,其中仅显示日期。

如何最好地做到这一点?

你可以做一些事情,将日期单独传递到时间,

datetime("m/d/Y", "g:i A")

然后将当前时间戳修改为 86400(以秒为单位的一天),如果它是 0,那么您知道现在是午夜,您可以显示"时间"参数而不仅仅是日期参数。

伪代码:

datetime(ts, day, time):
    if (ts % 86400 == 0):
        return format_ts(ts, day)
    else:
        return format_ts(ts, day + " " + time)

由于我是问这个问题的人,除非在接下来的 40 天内没有更好的答案,否则我不会选择以下内容。

$twig->addFilter(new Twig_SimpleFilter('datetime', function ($d,$f='m/d/Y g:i:s A') {
    $f=(strlen($d)==19 && substr($d, -8)=='00:00:00')?substr($f, 0, strpos($f, ' ')):$f;
    $date = new DateTime($d);
    return $date->format($f);
}));