You could do the validation in a microflow. In this case you'd put it in the microflow which is executed when you click on the form's 'Save' button, or replace the Save button with a custom microflow.
In this microflow, you could check the condition using an exclusive split, and if the check fails, display validation feedback on the date and end the microflow without committing the object. If the check comes out ok, the flow should then commit the object and close the form, as well as any other actions which are supposed to happen in this flow.
If there's multiple rules you want to check in one go, you could have the 'failed' path for a check display validation error, set a boolean 'ValidationErrors' to true and merge with the 'true' path, doing this for several checks and eventually checking 'ValidationErrors' to see if the microflow should end or if the commit/actions should be executed.
Usually Before Commit microflows can be suitable to check for validation conditions which should always be true. However I do not quite know your exact scenario, and validating with [%CurrentDateTime%] (which changes constantly) in a Before Commit might be risky if you decide to edit the object again later on. (Since the date picked earlier might well be valid, but would fail the [%CurrentDateTime%] check)