TimeZoneInfo
tak, tak. (Jest to część frameworka .NET, a nie część C# - C# to po prostu język, którego używasz.) Jednak nie sądzę, że naprawdę chcesz to robić.
Dlaczego przechowujesz DateTime
w serwerze strefa czasowa mimo wszystko? W większości przypadków rozsądniej byłoby przechowywać go w UTC. Pomijając wszystko inne, jeśli twój serwer znajduje się w strefie czasowej, w której obowiązuje czas letni, skończysz z niejasnością przez godzinę w roku, kiedy zegar się cofnie. (Ten sam czas lokalny występuje dwukrotnie.)
Gdy zapiszesz go jako UTC, powinieneś przekazać go również swojemu klientowi Javascript jako UTC. Chociaż mówisz, że masz "java script, który sprawi, że użytkownicy przesuną się z UTC" - będzie to zależeć od dokładnego momentu w czasie. Na przykład, ponieważ jestem w Wielkiej Brytanii, moje przesunięcie czasami wynosi 0, a czasami +1 godzina. Jeśli przekażesz czas UTC z powrotem do klienta, może to obliczyć czas lokalny z tego czasu UTC. Twój serwer nie, chyba że możesz uzyskać dokładne reprezentacja strefy czasowej od klienta do serwera, co na ogół jest trudne do zrobienia.
Ponownie sam C# nie ma tutaj znaczenia. Nie jest jasne, którą część platformy .NET masz na myśli — TimeZone
? TimeZoneInfo
? DateTime
? TimeZoneInfo
ma dane historyczne, ale tylko wtedy, gdy korzystasz z wersji systemu operacyjnego, która je obsługuje.
Cóż, o ile ci zależy. Nie ma tak wielu danych historycznych jak TZDB i ma bardzo dziwne reprezentacje dla Rosji i Namibii, ale ogólnie ma pomysł na zmianę zasad.