web-dev-qa-db-fra.com

Date Math / Manipulation dans le filtre de modèle liquide

Je construis une "URL d'intégration" dans Desk.com, qui utilise la syntaxe de filtre Shopify Liquid Template. Cette URL doit contenir une "date de début" et une "date de fin" pour une requête dont la date de début est il y a 7 jours et la date de fin est en ce moment.

Pour y parvenir, je pense que je dois soustraire 7 jours (604800 au temps Epoch) de l'objet 'now' puis appliquer ma mise en forme mais je ne peux pas trouver de syntaxe valide pour cela.

Pour l'heure actuelle, cette syntaxe est valide et fonctionne:

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

Il y a 7 jours, voici le meilleur que j'ai pu trouver (ne fonctionne pas):

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

Des suggestions sur une syntaxe valide pour "il y a 7 jours" dans Liquid? J'apprécierais grandement tout conseil!

22
jonaz

Un grand merci à @ iveskev de l'équipe "WOW" de Desk.com pour cette réponse:

Si tu fais {{'now'}} il renvoie la chaîne "maintenant" et non un horodatage pour l'heure actuelle. Donc, si vous le faites {{'now' | minus: 604800 }} il renvoie "-604800" et non l'heure Unix actuelle moins 604800. Lorsque vous utilisez le filtre date, le liquide détecte que vous faites référence à l'heure actuelle et sort l'heure sous forme de chaîne. Cependant, même si nous obtenons "maintenant" pour afficher la date actuelle, nous soustrayons toujours une chaîne et nous serons donc renvoyés avec "-604800". Le seul moment où les mathématiques sur une chaîne fonctionnent correctement est si la piqûre n'est qu'un nombre.

Donc, pour obtenir la date correcte, nous devons d'abord obtenir l'horodatage Unix pour l'instant, faire la soustraction, puis reformater au format souhaité. Vous pouvez utiliser %s pour obtenir l'heure Unix. Donc, pour obtenir l'heure actuelle sous unix, ce serait: {{'now' | date: '%s' }}

À ce stade, vous pouvez ensuite effectuer la soustraction, puis formater l'heure correctement. Nous pouvons le faire tout à la fois dans la déclaration suivante:

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

49
jonaz

pour ceux qui utilisent liquidjs, je ne pouvais pas trouver un moyen sans avoir un nouveau filtre, alors j'en ai fait un:

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

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

faisant ensuite:

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

J'ai publié un problème sur le dépôt liquidjs: https://github.com/harttle/liquidjs/issues/125

0
localhostdotdev