液体模板过滤器中的日期数学/操作

Posted

技术标签:

【中文标题】液体模板过滤器中的日期数学/操作【英文标题】:Date Math / Manipulation in Liquid Template Filter 【发布时间】:2014-01-30 04:08:49 【问题描述】:

我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前且结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期”。

为了实现这一点,我认为我需要从“现在”对象中减去 7 天(纪元时间为 604800),然后应用我的格式,但我无法找出有效的语法。

对于当前时间,此语法有效且有效:

'now' | date: "%b %d, %Y %I:%M %p -0500" | uri_encode | replace:"+","%20"

7 天前,这是我能想到的最好的(不工作):

'now' | minus : 604800 | date: "%b %d, %Y %I:%M %p -0500" | uri_encode | replace:"+","%20"

对 Liquid 中“7 天前”的有效语法有何建议?非常感谢任何建议!

【问题讨论】:

【参考方案1】:

对于那些使用liquidjs的人,如果没有新的过滤器,我就找不到方法,所以我做了一个:

daysAgo = (input) ->
  date = new Date()
  date.setDate(date.getDate() - parseInt(input, 10))
  date

parser.registerFilter('days_ago', (value) -> daysAgo(value))

然后做:

 1 | day_ago | date "%Y-%m-%d" 
2019-05-02

我在liquidjs repo 上发布了一个问题:https://github.com/harttle/liquidjs/issues/125

【讨论】:

【参考方案2】:

非常感谢来自 Desk.com “WOW” 团队的 @iveskev 的回答:

如果您执行'now',它会返回字符串“now”而不是当前时间的时间戳。因此,如果您执行'now' | minus: 604800 ,它会返回“-604800”,而不是当前的 unix 时间减去 604800。当您使用date 过滤器时,液体会发现您正在引用当前时间并将时间作为字符串输出。然而,即使我们得到“现在”来输出当前日期,我们仍然会从字符串中减去,因此将返回“-604800”。只有当字符串只是一个数字时,字符串上的数学才能正确工作。

因此,为了获得正确的日期,我们首先必须暂时获取 unix 时间戳,进行减法运算,然后重新格式化为所需的格式。您可以使用 %s 获取 unix 时间。因此,要在 unix 中获取当前时间,它将是: 'now' | date: '%s'

此时您可以进行减法运算,然后以正确的方式格式化时间。我们可以在下面的语句中一次性完成:

'now' | date: "%s" | minus : 604800 | date: "%b %d, %Y %I:%M %p -0500" | uri_encode | replace:"+","%20"

【讨论】:

很棒的方法。这并不完全正确(可能因版本、渲染器等而异) - 您需要在引号中加上 now"now" | date: "%s" | minus : 604800 谢谢,@ChrisHoughton。修改我的答案。 uri_encode 现在是url_encode,这也适用于液体宝石但不适用于液体js

以上是关于液体模板过滤器中的日期数学/操作的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板中的日期/时间格式

如何根据 django 模板中的日期过滤列表

不为空的液体过滤器集合

html Jekyll Casts - 液体:字符串过滤器

日期比较逻辑 / 在 Liquid 模板过滤器中

过滤器的原理是啥?