[Special Summer Sale] 40% OFF All Magento 2 Themes

Cart

Date Math / Manipulation in Liquid Template Filter

  • This topic is empty.
Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #9560
    jonaz
    Participant

    I’m constructing an “Integration URL” in Desk.com, which uses the Shopify Liquid Template filter syntax. This URL needs to contain a “start date” and an “end date” for a query where the start date is 7 days ago and the end date is right now.

    To achieve this I think I need to subtract 7 days (604800 in Epoch time) from the ‘now’ object and then apply my formatting but I can’t figure out valid syntax for that.

    For the current time, this syntax is valid and working:

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

    For 7 days ago, here’s the best I could come up with (isn’t working):

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

    Any suggestions on a valid syntax for “7 days ago” in Liquid? Would greatly appreciate any advice!

    #9562
    jonaz
    Participant

    Much thanks to @iveskev from the Desk.com “WOW” team for this answer:

    If you do {{'now'}} it returns the string “now” not a timestamp for the current time. So if you do {{'now' | minus: 604800 }} it returns “-604800” not the current unix time minus 604800. When you use the date filter, then liquid picks up that you are referencing the current time and outputs the time as a string. However even if we get ‘now’ to output the current date, we are still subtracting from a string and so will be returned with “-604800”. The only time that math on a string works correctly is if the sting is only a number.

    So in order to get the correct date we first have to get the unix timestamp for now, do the subtraction, then reformat to the desired formate. You can use %s to get unix time. So to get the current time in unix it would be:
    {{'now' | date: '%s' }}

    At that point you can then do the subtraction and then format the time in the correct way. We can do this all at once in the following statement:

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

    #9561
    localhostdotdev
    Participant

    for those using liquidjs I couldn’t find a way without having a new filter, so I made one:

    daysAgo = (input) ->
      date = new Date()
      date.setDate(date.getDate() - parseInt(input, 10))
      date
    
    parser.registerFilter('days_ago', (value) -> daysAgo(value))
    

    then doing:

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

    I’ve posted an issue on the liquidjs repo: https://github.com/harttle/liquidjs/issues/125

Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.