Jekyll:无法按日期排序集合

13
这让我感到疯狂。
我有这个集合resources:
# _config.yml
collections:
  resources:
    output: true
    permalink: /resources/:name/

他们都有日期:
# /_resources/example.md
---
title: Learn the Web
date: 09-04-2013  
---

页面已经生成,如果我尝试显示它的日期,那么日期会被正确显示,但是我也想按日期排序,但是它就是不起作用。我做错了什么?
{% assign sortedResources = site.resources | sort: 'date' %} <!-- Doesn't work -->
{% for resource in sortedResources %}
  <div>
    {{resource.title}}
    <small>{{resource.date | date: "%d %b %Y"}}</small> <!-- Works -->
  </div>
{% endfor %}

我正在使用:

▶ ruby --version
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]
▶ jekyll --version
jekyll 2.5.3

谢谢


1
上帝啊,这真是让我抓狂。我一度以为自己要疯了。 - Sauce McBoss
3个回答

10

如果您的收集项在片头有一个有效的dateISO 8601格式),它们将自动按日期排序,最早的排在前面。

如果您想先输出较新的项目,可以像这样reverse更改排序顺序:

{% assign sorted = site.resources | reverse %}
{% for item in sorted %}
  <h1>{{ item.name }}</h1>
  <p>{{ item.content }}</p>
{% endfor %}

由于某些原因,内置的 sort_by 功能对我来说无法正常工作(对于普通的字符串/数字属性),所以最终我使用了 {% assign items = site.query_provider | sort: 'order' %}。谢谢。 - Gordon
应该把{% assign items = site.query_provider | sort: 'order' %}放在哪里? - Relyativist

9

我目前在处理集合方面也遇到同样的问题。

当尝试按照欧洲格式的日期进行排序,例如dd/mm/yyyydd-mm-yyyy时,我得到的是字符串排序。即使在_config.yml文件中设置了timezone: Europe/Paris

唯一能够按日期排序的方法就是使用ISO格式yyyy-mm-dd

# /_resources/example.md
---
title: Learn the Web
date: 2013-04-09  
---

现在排序已经生效。

编辑 - 这是jekyll管理“日期”的方式:

date: "2015-12-21" # String
date: 2015-12-1    # String D not zero paded
date: 01-12-2015   # String French format
date: 2015-12-01   # Date
date: 2015-12-21 12:21:22  # Time
date: 2015-12-21 12:21:22 +0100 # Time

如果你不需要时间,你可以坚持使用date: YYYY-MM-DD格式。并且在整个集合中保持一致。如果混用字符串、日期和/或时间,则Liquid会抛出错误,如Liquid error: comparison of Date with Time failedLiquid error: comparison of String with Date failed

我尝试使用这种方法对我的集合进行排序,但它对我没有起作用。事实上,我无法理解它是如何对集合进行排序的。还有其他想法,我应该检查什么? - ChrisChinchilla
你是否已经为这个具体的问题提交了一个问题?我提交了类似的内容:https://github.com/jekyll/jekyll/issues/4687 - Sauce McBoss
@LorenRogers,请看我的答案编辑。这不是一个错误。 - David Jacquel
@DavidJacquel 谢谢你提供的信息--听起来这似乎是一个文档问题。我会在我的Github问题中做出备注。 - Sauce McBoss
3
请注意,yyyy-mm-dd 不是美国格式,而是 ISO 格式并且被国际公认。 - vhs

5

我明白了:资源是按照日期字符串(例如 19-06-2015)排序的,这是不正确的。

我创建了自定义过滤器:

# _plugins/filters.rb
module Jekyll
  module DateFilter
    require 'date'
    def date_sort(collection)
      collection.sort_by do |el|
        Date.parse(el.data['date'], '%d-%m-%Y')
      end
    end
  end
end
Liquid::Template.register_filter(Jekyll::DateFilter)

使用方法如下:

{% assign sortedResources = site.resources | date_sort | reverse %}
{% for resource in sortedResources %}
  <div>{{resource.title}}</div>
{% endfor %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接