Just what the subject says - how do I display start and end dates in the "long" (or any) format, but display the time of day only if the start and end date are the same calendar day?

For example, I'd want to display:
January 16 - 3:00 pm - 5:00 pm (with time)

but I'd want to display
January 16 - January 20 (no time)

I've tried writing a views customfield that tests $data->node_data_field_date_field_date_value against $data->node_data_field_date_field_date_value2 and then formats them with format_date(..) or date_format_date(..), but there's a timezone issue: the raw value from the $data object is in GMT, and with those two functions, and depending whether or not I supply a $zone = date_default_timezone_get();
argument to format_date, it either displays the string in GMT or in GMT+0500 (I'm in the Eastern US and it's supposed to be GMT-0500).

I've also tried just doing a string comparison and replace, but I can't find out how to pull the original formatted string that would display with just the normal Views date field into the php code.

Help! Thanks!