Q:

Get DateTime object given local time as string, date as UTC DateTime and a timezone-locale string?

I'm working with data from several sources, and I need to put together an accurate DateTime.
I have:  
A) a string representing a time of day, e.g.: "4:00 pm"
B)  a DateTime object intended to represent a pure date, by having been created as midnight, zulu time (offset of 00:00) for a particular date.
C) a string representing a timezone locale, e.g.: "America/Los_Angeles"
How do I get a precise DateTime object, with correct number of ticks, representing the time (A) experienced in that locale (C), on that date (B)??

A:

Here you have an example using NodaTime, which is more reliable of any of the framework classes when dealing with calendars, time zones, dates and times:
var timeString = "4:00 pm";
var pureDate = new DateTime(2017, 5, 22, 0, 0, 0, DateTimeKind.Utc);
var timezoneString = "America/Los_Angeles";

var localTime = ParseTimeString(timeString);

var localDate = LocalDate.FromDateTime(pureDate);

var localDateTime = localDate.At(localTime);

var zone = DateTimeZoneProviders.Tzdb[timezoneString];

var zonedDateTime = localDateTime.InZoneStrictly(zone);

Inside zonedDateTime you will find your full date:
"2017-05-22T16:00:00 America/Los_Angeles (-07)"

You may than use zonedDateTime.ToDateTimeUtc() to get a System.DateTime instance in UTC.
ParseTimeString parses your time string using your format specifier:
public static LocalTime ParseTimeString(string timeString)
{
    var pattern = LocalTimePattern.CreateWithInvariantCulture("h:mm tt");
    return pattern.Parse(timeString).Value;
}

Considerations if you use DateTime, DateTimeOffset and TimeZoneInfo
If you do not want to use NodaTime be aware of the possible pitfalls of the built-in classes:

TimeZoneInfo in Windows uses a different specifier that is not compatible with IANA/TZDB. Your America/Los_Angeles time zone string will not work if you do not convert it before use (see https://stackoverflow.com/tags/timezone/info)
DateTimeOffset (which is more reliable then DateTime) still loses information when created. The time zone data cannot be persisted and you will have just a date with an offset from UTC.
You'll need to manually parse your custom time string (maybe using regexes).

