Dates, Times, and Formatting
Time Zones
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
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}");
}
}
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
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
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