Postgres 11 declarative partitioning by relative time
You could partition by 4 hour intervals (aligned to a specific boundary pattern) and then subpartition that into hours.  But, I don't see what that would get you. If you have them partitioned by hour and run a query that covers 4 hours, it will just query the appropriate 4 individual hourly partitions.  Adding an intervening layer of 4-hour partitioning doesn't get you anything.

For 2, no.  It would have to move rows between partitions atomically with the tick of the smallest clock granularity, and that just isn't feasible.  But if you query for an unaligned one hour interval, it will just have to include two adjacent one hour partitions, so it should still get a large part of whatever benefit there is to be had.

But it isn't clear what benefit there is to be had. It will depend on the nature of your queries. The biggest benefit you might get would be that once data reaches 31 days, you could drop the partition, rather than needing a massive DELETE.