DateTime nie zna swojego przesunięcia w strefie czasowej. Nie ma wbudowanej metody zwracania przesunięcia lub nazwy strefy czasowej (np. EAT, CEST, EST itp.).
Jak sugerowali inni, możesz przekonwertować swoją datę na UTC:
DateTime localtime = new DateTime.Now;
var utctime = localtime.ToUniversalTime();
a potem tylko oblicz różnicę:
TimeSpan difference = localtime - utctime;
Możesz również przekonwertować jeden raz na inny za pomocą DateTimeOffset:
DateTimeOffset targetTime = DateTimeOffset.Now.ToOffset(new TimeSpan(5, 30, 0));
Ale jest to rodzaj stratnej kompresji - samo przesunięcie nie może powiedzieć, która to strefa czasowa, ponieważ dwa różne kraje mogą znajdować się w różnych strefach czasowych i mieć ten sam czas tylko przez część roku (np. RPA i Europa). Należy również pamiętać, że letni czas letni może zostać wprowadzony w różnych terminach (EST vs CET - różnica 3 tygodni).
Nazwę lokalnej strefy czasowej systemu można uzyskać za pomocą klasy TimeZoneInfo:
TimeZoneInfo localZone = TimeZoneInfo.Local;
localZone.IsDaylightSavingTime(localtime) ? localZone.DaylightName : localZone.StandardName
Zgadzam się z Gerrie Schenck, przeczytaj artykuł, który zasugerował.