如何让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过滤器:
- 在站点根目录新建
_plugins文件夹(若不存在) - 创建
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)
- 在任意模板中直接使用过滤器:
<div>Document date: {{ page | page_date | date: '%d %b %Y' }}</div>
该过滤器会自动判断页面是否有指定日期,无则返回site.time,无需额外判断逻辑。
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

