The void loop automatically loops so you can calculate the number of milliseconds in 2, 4, and 8 hours, and add more delays. (The Arduino only keeps track of time in milliseconds unless you a library or additional code, or additional hardware.)
There are a couple of issues -
Every line of code takes some time to execute and that time is added to the delay()s. If you have a long delay, a few extra milliseconds or microseconds isn't a big deal, but with short delays and/or with code executed over-and-over in a loop it will introduce a significant error and of course, the error accumulates every time through the loop.
If that's an issue you can use a millis() timer.. The millis() clock runs continuously in the background so errors don't accumulate. The millis() timer/counter hits its maximum count after about 45 days and "rolls-over" to zero. There's a way to deal with that but I can't remember what it is.
Another thing is, the built-in clock isn't very accurate. It's not as accurate as a watch or clock but it might be OK for a one-day cycle. If your code is going to run continuously day-after-day the errors WILL accumulate.
If you need longer term accuracy you can use a real-time clock ("RTC") module. These tell the time of day (and usually the date) and the are much more accurate. Or if you want to get really fancy you can use a GPS or Cell network module (or any network module) to get "perfect time" from the network.