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

如何让Jekyll站点未指定日期时默认使用site.time

问题:如何让Jekyll页面默认使用site.time作为日期?

我需要实现:Jekyll站点中所有页面,若文件名或front matter未指定日期,默认将日期值设为site.time。

在HTML布局文件中使用{{ site.time }}可正常生效,但在_config.yml的defaults中设置时,出现以下错误:

Invalid date 'site.time': An invalid date format was found in a front-matter default set: {"scope"=>{"path"=>""}, "values"=>{"date"=>"site.time"}} (Jekyll::Errors::InvalidDateError)

我在_config.yml中尝试过以下几种写法,均无效:

defaults:
  - scope:
      path: ""
    values:
      date: "{{ site.time }}"
      # OR
      date: site.time
      # OR
      date: "{{ site.time | date: '%d %b %Y' }}"
      # OR
      date: "now"
      # OR
      date: "{{ 'now' }}"

补充:目前我能通过模板代码实现类似效果,但这种方式需要重复编写判断逻辑,我更希望通过默认配置直接使用page.date:

{% if page.date %}
<div>Document date: {{ page.date }}</div>
{% else %}
<div>Document date: {{ site.time }}</div>
{% endif %}

解决方案

核心原因:Defaults不支持Liquid解析

Jekyll的_config.yml中defaults配置仅接受静态值,不会解析Liquid模板语法。你输入的site.time或{{ site.time }}都会被识别为纯文本字符串,而非有效的日期对象,因此触发无效日期错误。包括"now"这类关键词也无法被解析为当前时间。

可行实现方法

方法1:使用全局布局统一处理(无需插件)

将日期判断逻辑写入全局基础布局文件(如_layouts/default.html),所有页面继承该布局后即可复用逻辑,无需重复编写:

{% assign doc_date = page.date | default: site.time %}
<!-- 后续直接使用 doc_date 变量即可 -->
<div>Document date: {{ doc_date | date: '%d %b %Y' }}</div>

这样在所有页面的模板中,都可以直接调用doc_date变量获取正确的日期值,无需再写if-else判断。

方法2:自定义Liquid过滤器(更灵活)

若需要在更多场景复用日期逻辑,可创建自定义Liquid过滤器:

  1. 在站点根目录新建_plugins文件夹(若不存在)
  2. 创建page_date_filter.rb文件,写入以下代码:
module Jekyll
  module PageDateFilter
    def page_date(page)
      page.date || @context.registers[:site].time
    end
  end
end

Liquid::Template.register_filter(Jekyll::PageDateFilter)
  1. 在任意模板中直接使用过滤器:
<div>Document date: {{ page | page_date | date: '%d %b %Y' }}</div>

该过滤器会自动判断页面是否有指定日期,无则返回site.time,无需额外判断逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:45:31