Is it possible to index or cache non-immutable function (based on date)
You could use materialized views, but you would still need some external tool (cron, etc.) to refresh them on a regular basis.  You could install some PostgreSQL-based scheduling system, but that would also count as an external tool as they don't ship with PostgreSQL.  (And would probably rely on cron internally anyway).  

You could have the querent (an already existing "external tool") itself do the refresh.  It is a bit tricky for it to know when to, though. You would have to store the last refresh time someplace, then trigger a refresh if that is too old, then update that stored time.  If it needs to refresh before returning a result, then it will kind of suck for the unlucky user to whom that task falls.