在液态模板过滤器中进行日期数学/操作

27

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

为了实现这一点,我认为我需要从“现在”对象中减去7天(Epoch时间中的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天前”有效语法的建议?非常感谢任何建议!

2个回答

63

非常感谢来自 Desk.com 的“WOW”团队成员@iveskev提供的答案:

如果您使用{{'now'}},它将返回字符串“now”,而不是当前时间戳。因此,如果您使用{{'now' | minus: 604800 }},它将返回“-604800”,而不是当前Unix时间减去604800。当您使用date过滤器时,然后Liquid会察觉到您正在引用当前时间并输出时间作为字符串。但是,即使我们让‘now’输出当前日期,我们仍然在从字符串中减去,并且将以“-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"}}


2
很棒的方法。但这并不完全正确(可能因版本、渲染器等而异)- 你需要在引号中加上 now"now" | date: "%s" | minus : 604800 - Chris Houghton
谢谢,@ChrisHoughton。正在修改我的答案。 - jonaz
uri_encode 现在改为 url_encode,同时该功能可以在 Liquid Gem 中使用,但无法在 LiquidJS 中使用。 - localhostdotdev

0

对于那些使用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存储库上发布了一个问题:https://github.com/harttle/liquidjs/issues/125

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