Split a date field output into two spans
If your current approach works, consider sticking with it.  Use field_get_items() to get past the "field won't always have the language" problem.

To answer the original question, at admin/config/regional/date-time you'll find a tab to create a new format.  You can somewhat laboriously create a format based on something like:

&lt;\s\p\a\n \c\l\a\s\s="\f\o\o"&gt;l F j&lt;/\s\p\a\n&gt; - &lt;\s\p\a\n \c\l\a\s\s="\b\a\r"&gt;g:i a&lt;/\s\p\a\n&gt;


All the backslashes may not be necessary, but you have to backslash escape any character that is a special date code.

Then edit a type or make a new one that uses your format with the markup built in.