I wish all implementations would at least accept one previous generation. It sucks having to either wait for the next code or try to input before the timeout if it is close.
I'm not sure I've ran into an implementation that doesn't.
I used to wait for the code to rollover before entering it but honestly if you're not sure if the implementation accepts a previous code or now just use that time to try it and if it fails you still have like 45s to enter the current code.