I finally got what you meant, sorry. I never thought of all-day events as having a duration, despite their name; on calendar applications they are usually marked once for the day, not as having a duration of 24 hours. The use case is more like "Foo's birthday" than "It will be Foo's birthday for 24 hours today", if you get my meaning.
It all probably means I'll have to distinguish them by hand after all, before giving them to DateTime::Format::whatever.
I was hoping there would be some way to recognize a DateTime object created with no time from a DateTime object created with 0:00 as the time. Well, if there ain't, there ain't.
Thank you for your input!