Working out how many hours worked after a certain time
I agree with your summation that it is clumsy.  I see you like to stringly type objects, such as GetTimeOfDayFromDateTime.  It would be neater to just get the time of day as a TimeSpan.  Also, you may have several overloads accepting different input arguments, so you don't need to include the FromDateTime in the name.

public static TimeSpan GetTimeOfDay(DateTime d) =&gt; d - d.Date;


Or if you want to simply check AM versus PM, you could use the DateTime.Hour.  If the hour is &lt; 12, it's AM.  Otherwise, it's PM.

Now GetDuration doesn't have to accept string inputs.  They can accept the TimeSpan (i.e. time of day) for start and end, or just better yet, just subtract the 2 DateTime objects.

This just looks clumsy:

double baseMondayHours = 10.00;
baseMondayHours = (baseMondayHours - 0.5);


Cleaner would be either:

double baseMondayHours = 10.0 - 0.5;


or directly

double baseMondayHours = 9.5;


Another tip to keep in mind: Subtracting dates can produce bad results if the Kind of each DateTime is different.  Doesn't seem to be the case here, but be forewarned.