Dynamic typing is insane. You have to keep track of the type of absolutely everything, in your head. It's like the assembly of type systems, except it makes your program slower instead of faster.
Nothing like trying to make sense of code you come across and all the function parameters have unhelpful names, are not primitive types, and have no type information whatsoever. Then you get to crawl through the entire thing to make sense of it.
What happens when you coerce a string to a date-and-time but it's not valid?
Where I'm from (Rust), error handling is very strict and very explicit, and that's how it should be. It forces you to properly handle everything that can potentially go wrong, instead of just crashing and looking like a fool.
When you say user, you mean a user of a function? In that case PHP would throw a TypeError, and presumably only happens when developing/testing.
If you mean in production, like when submitting a form, an Exception may be thrown. In which case you catch it and return some error message to the user saying the date string is invalid.
By “user” I mean the person who is using the application.
Using exceptions for handling unexceptional errors (like invalid user input) is a footgun. You don't know when one might be raised, nor what type it will have, so you can easily forget to catch it and handle it properly, and then your app crashes.