Use explicit offsets instead of the host computer's local zone.

offsets `DateTimeOffset` keeps a date and time together with a known UTC offset.

Time Zones

offsetHours
TimeZones.cs
Replay: real traced execution (multi-file project)
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        int offsetHours = -5;
        DateTimeOffset meeting = new DateTimeOffset(
            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)
        );
        DateTimeOffset utc = meeting.ToUniversalTime();

        string localText = meeting.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);
        string utcText = utc.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);

        Console.WriteLine($"local={localText}");
        Console.WriteLine($"utc={utcText}");
    }
}
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        int offsetHours = 0;
        DateTimeOffset meeting = new DateTimeOffset(
            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)
        );
        DateTimeOffset utc = meeting.ToUniversalTime();

        string localText = meeting.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);
        string utcText = utc.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);

        Console.WriteLine($"local={localText}");
        Console.WriteLine($"utc={utcText}");
    }
}
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        int offsetHours = 2;
        DateTimeOffset meeting = new DateTimeOffset(
            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)
        );
        DateTimeOffset utc = meeting.ToUniversalTime();

        string localText = meeting.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);
        string utcText = utc.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);

        Console.WriteLine($"local={localText}");
        Console.WriteLine($"utc={utcText}");
    }
}
  1. offsetHours ← -5, meeting ← 05/20/2026 14:30:00 -05:00, utc ← 05/20/2026 19:30:00 +00:00

    5{6    static void Main()7    {8        int offsetHours→ -5 = -5; //@offsetHours=0, 29        DateTimeOffset meeting→ 05/20/2026 14:30:00 -05:00 = new DateTimeOffset(10            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)11        );12        DateTimeOffset utc→ 05/20/2026 19:30:00 +00:00 = meeting05/20/2026 14:30:00 -05:00.ToUniversalTime();1314        string localText→ 2026-05-20 14:30 -05:00 = meeting05/20/2026 14:30:00 -05:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);15        string utcText→ 2026-05-20 19:30 +00:00 = utc05/20/2026 19:30:00 +00:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);1617        Console.WriteLine($"local={localText2026-05-20 14:30 -05:00}");18        Console.WriteLine($"utc={utcText2026-05-20 19:30 +00:00}");19    }
    outputlocal=2026-05-20 14:30 -05:00
    utc=2026-05-20 19:30 +00:00
  1. offsetHours ← 0, meeting ← 05/20/2026 14:30:00 +00:00, utc ← 05/20/2026 14:30:00 +00:00

    5{6    static void Main()7    {8        int offsetHours→ 0 = 0;9        DateTimeOffset meeting→ 05/20/2026 14:30:00 +00:00 = new DateTimeOffset(10            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)11        );12        DateTimeOffset utc→ 05/20/2026 14:30:00 +00:00 = meeting05/20/2026 14:30:00 +00:00.ToUniversalTime();1314        string localText→ 2026-05-20 14:30 +00:00 = meeting05/20/2026 14:30:00 +00:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);15        string utcText→ 2026-05-20 14:30 +00:00 = utc05/20/2026 14:30:00 +00:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);1617        Console.WriteLine($"local={localText2026-05-20 14:30 +00:00}");18        Console.WriteLine($"utc={utcText2026-05-20 14:30 +00:00}");19    }
    outputlocal=2026-05-20 14:30 +00:00
    utc=2026-05-20 14:30 +00:00
  1. offsetHours ← 2, meeting ← 05/20/2026 14:30:00 +02:00, utc ← 05/20/2026 12:30:00 +00:00

    5{6    static void Main()7    {8        int offsetHours→ 2 = 2;9        DateTimeOffset meeting→ 05/20/2026 14:30:00 +02:00 = new DateTimeOffset(10            2026, 5, 20, 14, 30, 0, TimeSpan.FromHours(offsetHours)11        );12        DateTimeOffset utc→ 05/20/2026 12:30:00 +00:00 = meeting05/20/2026 14:30:00 +02:00.ToUniversalTime();1314        string localText→ 2026-05-20 14:30 +02:00 = meeting05/20/2026 14:30:00 +02:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);15        string utcText→ 2026-05-20 12:30 +00:00 = utc05/20/2026 12:30:00 +00:00.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture);1617        Console.WriteLine($"local={localText2026-05-20 14:30 +02:00}");18        Console.WriteLine($"utc={utcText2026-05-20 12:30 +00:00}");19    }
    outputlocal=2026-05-20 14:30 +02:00
    utc=2026-05-20 12:30 +00:00