Time.zone.parseに渡す引数は日付っぽいものであり、かつvalidであればきちんとparseされ、
日付として認識されるフォーマットでありつつも値がおかしい(2020-99-99 99:99:99など)場合はArgumentErrorがraiseされ、
そもそも日付として認識されない文字列はnilを返す。
nilを返すんですね。(2回目)
最後の場合もArgumentErrorがraiseされる想定だったためハマった。
要件としては「ユーザーが自由入力できる入力欄において、日付としてvalidな文字列であればそのまま保存し、invalidな文字列であればエラーを吐かせる」ものだったのであまりないパターンかとは思う。
参考
リファレンス
https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse
20:00:00とかもいけるっぽい(日付は現在日付になる)
Qiita
https://qiita.com/slightair/items/fa5f63016c0c848111a9
ここでもnilになる挙動について少し触れられている