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