Если вы хотите, чтобы в вашем формате было обязательное время, вы можете использовать:
^([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0]?[1-9]|[1][0-2])[.\/-]([0-9]{4}|[0-9]{2})\s+([01]?\d|2[0-3]):([0-5]?\d)(:[0-5]?\d)?$
Если вы хотите, чтобы время было необязательным, вы можете использовать:
^([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0]?[1-9]|[1][0-2])[.\/-]([0-9]{4}|[0-9]{2})(\s+([01]?\d|2[0-3]):([0-5]?\d)(:[0-5]?\d)?)?$
Конечно группы захвата могут быть изменены в зависимости от того, какие данные вам нужно извлечь, если таковые имеются.
При этом я бы рекомендовал библиотеку дат для обработки таких вещей, как это в большинстве случаев, хотя иногда вам может понадобиться регулярное выражение, например, для проверка формы в рамках, которые принимают только регулярные выражения.