I would like to loop through entries only if the current date/time is before 5am on the following day from when the entry's eventDate (custom field mind you)is.

In other words I may have an event at 10pm on May/1/2015 and i want to loop through that date as long as it is not 5am (or later) on May/2/2015.

What I have currently is this:

{% for slide in craft.entries.section('events').featured('1').order('dateTime asc').limit(5).find() if (slide.dateTime|date("c","+8hours")) >= now|date("c") %}

However as you might have guessed, as far as i understand it, this loops through all entries as long as the current date/time is less than 8 hours AFTER the date/time of the event entry.

So to my understanding (Based on what i have observed) this will loop the entry up until 6am May/2/2015 which is not what i want.

In short. I'd like to ignore the 'time' portion of my date/time field as if it were May 1, 2015 12:00AM and add 29 hours, rather than including the time parameter of my date/time field and doing the math based on that which outputs variable results based on the time of the event.

Please let me know if i need to clarify any, I hope i've been clear. Also please let me know if there is anything else wrong with my For loop, it seems to work exactly how it should minus the date issue, but i'm always open to improvement.


You could use my Auto Expire plugin to make those entries expire the next morning 5 AM after the event. Just add a new expiration rule with the expiration date set to:

{ dateTime|date_modify('tomorrow 5am')|date('U') }

and you can now remove the logic from the templates. A nice side-effect is that expired entries are indicated with red traffic lights in the CP index view.

| improve this answer | |

You could try using the date_modify filter with a relative DateTime format:

{% if slide.dateTime|date_modify('tomorrow 5am')|date('U') < now|date('U') %}

And if you want to limit the entries to be displayed, you should not use the limit parameter for that. Your ElementCriteriaModel doesn't take your DateTime conditional into account, so it requires a custom solution:

{% set slides = craft.entries.section('events').featured('1').order('dateTime asc').limit(null) %}

{% set count = 0 %}
{% for slide in slides %}
    {% if count < 5 and slide.dateTime|date_modify('tomorrow 5am')|date('U') < now|date('U') %}
        {{ slide.dateTime }}
        {% set count = count + 1 %}
    {% endif %}
{% endfor %}
| improve this answer | |
  • Using your suggestion i changed it to be: {% for slide in craft.entries.section('events').featured('1').order('dateTime asc').limit(5).find() if (slide.dateTime|date_modify("tomorrow 5am")|date("c")) >= now|date("c") %} and appears to work perfectly. You are a god among men! Thanks! – Christopher Healey Apr 21 '15 at 22:37
  • Christopher, comparing DateTime values probably works best with Unix timestamps. Updated the date filter argument to date('U'). Thanks – carlcs Apr 22 '15 at 6:07
  • Carlcs my conditional seems to work as expected. In fact if i put the conditional as a child of the for loop rather than as a part of it, it seemed to still loop through items that did not meet the condition (it would not output them, but it'd still loop them) giving an incorrect # of items. Am i missing something? – Christopher Healey Apr 23 '15 at 13:28
  • It would loop that slide but the counter wouldn't be increased. – carlcs Apr 23 '15 at 13:30
  • It shouldn't matter where you put the conditional, I only removed it from the for tag because I thought it's more readable. To make it even more clear you could also split the two conditionals into separate tags. – carlcs Apr 23 '15 at 13:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.