using System.Globalization;
public static void Main()
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/London");
DateTime london = new DateTime(2023, 10, 29, 1, 30, 0);
DateTime utcFromDst = london.ToUniversalTime(tz, true);
DateTime utcFromStd = london.ToUniversalTime(tz, false);
Console.WriteLine($"London: {london}");
Console.WriteLine($"UTC: {utcFromDst} (assuming input was daylight time)");
Console.WriteLine($"UTC: {utcFromStd} (assuming input was standard time)");
public static class Extensions
public static DateTime ToUniversalTime(this DateTime dt, TimeZoneInfo tz, bool isDst)
if (dt.Kind != DateTimeKind.Unspecified)
return dt.ToUniversalTime();
if (tz.IsInvalidTime(dt))
throw new ArgumentException("Invalid local date and time for the specified time zone.");
if (tz.IsAmbiguousTime(dt))
TimeSpan[] offsets = tz.GetAmbiguousTimeOffsets(dt);
TimeSpan offset = isDst ? offsets[1] : offsets[0];
DateTimeOffset dto = new DateTimeOffset(dt, offset);
return TimeZoneInfo.ConvertTimeToUtc(dt, tz);