Proper way to route calls based on time

Proper is relative, and time conditions were built for your use case. There may be a more optimized way to do this using one dynamic route, if interested.
Dynamic Routes Module - PBX GUI - Sangoma Documentation (atlassian.net)
Use Dynamic Routes to Execute a shell script - FreePBX / Tips and Tricks - FreePBX Community Forums

You could set an Asterisk variable by nesting a strftime command inside IF and SET commands to provide a value representing the four states your route could be in, then make four routes on the dynamic route that go to each of the four states.

Information about Asterisk Function strftime | Voip-info.org

Asterisk cmd Set - VoIP-Info

Asterisk func if - VoIP-Info

This is nicer in my opinion because everything is in one dynamic route, vs multiple time conditions. Besides using Asterisk commands, you could also use a MySQL query or the AGI to calculate the time and provide the value, if you prefer.

Of course, if you prefer not to, there is nothing wrong with your approach either.