Is there any way of distinguishing whether a Date field's "time" is set or not? Date fields can have an optional "time" box. This works nicely in the admin, but I can't figure out whether there's any way to access date and time separately when accessing that field via a template.

The use case I'm thinking of is an "Event Date" field on an "Event" entry type, which may or may not have a time (because an event may be all day, or may be at a particular time). The way you'd format the date would likely differ depending on whether the time field was filled in or not.

I realise there are other ways of achieving this effect (eg. adding an extra "show time" switch), but I'm wondering specifically whether this is currently doable using just a standard Date field's optional time field?
The values entered in Date/Time fields are always saved as Craft datetime objects. This means it doesn't matter if you configure it to show the date, the time or both, Craft always saves them the same.

If you make it to show both, so you're able to enter a time for your events, you have to do this in the field's settings for all entries of your "Event" entry type. So to be able to switch input forms (a truly "optional" time field), you would actually need to have two entry types "Event with date" and "Event without date". Not the cleanest solution in my opinion.

What I'd do instead is to use two separate Date/Time fields, one configured to show the date and the other one to show the time. The client would only fill out the time field when necessary. And in the template you'd be able to check for an empty field.

{{ entry.eventDate|date('l, j. F Y') }}

{% if entry.eventTime %}
    {{ entry.eventTime|date('G:i') }}
{% endif %}