Since you’re talking about syncing times, I assume you want these “effects” (not sure what you mean by effects exactly… animations, particles, etc) to be run on the client.
I was wondering first of all, is there a particular reason you are using time as a marker for effects? If possible, I would highly recommend using the wait function on a server script to set intervals between various effects, and then use RemoteFunctions (or Events) to signal the clients to play the effect in sync.
Also, yes, OOP would be a good way to store these effects, however assuming what I said above is a viable solution for you, there would be no need for chronologically ordering them. The RemoteFunction on the server would simply pass an argument that identifies which effect is to be played, and then play it using a play function stored in that effect object.
If you mean syncing times as in adjusting for latency, then what I would do is first sync the time by invoking the server with a RemoteFunction, with the client tick as an argument, then returning the difference between the server tick and the tick passed to the function. You now know your difference between server time and client time. As for ensuring effects play at the right time? I would still use the wait functions on the server, using RemoteFunctions to tell each client when to play the effect. How would I adjust for latency using this method? Well since I know the difference between server tick and client tick, I can simply invoke each client a few seconds or milliseconds early, passing the tick() that the effect should be played at as an argument, ie:
InvokeClient(player, serverTickThatEffectWillPlay, effectToPlayIdentifier)
When each client receives this call (early, as stated), it will then determine how long to wait before playing that effect, by determining real server time using the difference we calculated during our sync earlier, and then waiting the difference between the real server time and the serverTickThatEffectWillPlay parameter. Then you can use effect objects as you suggested that contain a play function to play that animation, which is identified by the effectToPlayIdentifier parameter.
You don’t really need the RemoteFunctions to signal the effects to play, you only really need the initial server and client tick synchronization, as well as the server tick that each animation is to play at, although I personally find it more intuitive to use the RemoteFunctions.