You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Silverstripe模板中如何比较$date_ok变量与当前日期?

在Silverstripe模板中比较日期与当前日期的解决方案

嘿,我来帮你搞定这个Silverstripe模板里的日期比较问题!首先得明确:Silverstripe的模板引擎不允许直接使用PHP函数(比如你写的date("j, n, Y")),所以不能直接把这个写进模板里。不过有两种简单的方法可以实现你的需求:

方法1:利用Silverstripe内置的Now全局变量

Silverstripe模板自带了一个$Now全局变量,它是一个Datetime对象,代表当前的日期时间。如果你的$date_ok是Silverstripe的Date或Datetime类型字段(也就是在DataObject里定义的Date/Datetime类型),那么可以直接在模板里做对象比较:

<% loop $IzdMat %>
<tr>
    <td>$num</td>
    <td><strong>$sert_otip</strong><br>Valid from $date_start till $date_ok</td>
    <% if $date_ok < $Now %>
        <!-- 这里写$date_ok早于当前日期时要显示的内容 -->
    <% end_if %>
</tr>
<% end_loop %>

这个方法最省心,不需要额外写后端代码,只要你的$date_ok是正确的日期字段类型就行。

方法2:在后端定义自定义的当前日期变量

如果因为某些原因(比如你需要精确到日期而非时间,或者要统一格式),你可以在对应的DataObject或者Page控制器里添加一个方法,返回当前日期的对象:

// 比如在你的IzdMat DataObject里
public function getCurrentDate() {
    // 返回只包含日期的Date对象,不含时间部分
    return Date::create();
}

然后在模板里用这个自定义变量来比较:

<% loop $IzdMat %>
<tr>
    <td>$num</td>
    <td><strong>$sert_otip</strong><br>Valid from $date_start till $date_ok</td>
    <% if $date_ok < $CurrentDate %>
        <!-- 过期内容 -->
    <% end_if %>
</tr>
<% end_loop %>

注意事项

  • 如果你存储的$date_ok是字符串格式(而非Silverstripe的Date字段),一定要先在后端把它转换成Date对象,否则字符串比较可能会出问题(比如"10, 5, 2024"和"2, 6, 2024"按字符串比较会得到错误结果)。转换示例:
    public function getDateOk() {
        // 假设你的日期字符串格式是"j, n, Y"(比如"5, 6, 2024")
        return Date::createFromString($this->date_ok, 'j, n, Y');
    }
    
    然后模板里用$DateOk代替原来的$date_ok进行比较。

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:26