Problemy z konwersją mojego DateTime na UTC

Przechowuję wszystkie moje daty w formacie UTC w mojej bazie danych. Pytam użytkownika o ich strefę czasową i chcę użyć ich strefy czasowej oraz tego, co zgaduję, to czas serwera, aby ustalić dla nich UTC.

Gdy już to zrobię, chcę przeprowadzić wyszukiwanie, aby zobaczyć, jaki zakres znajduje się w bazie danych przy użyciu ich nowo skonwertowanej daty UTC.

ale zawsze otrzymuję ten wyjątek.

System.ArgumentException was unhandled by user code  
Message="The conversion could not be completed because the   
supplied DateTime did not have the Kind property set correctly.  
For example, when the Kind property is DateTimeKind.Local,   
the source time zone must be TimeZoneInfo.Local.  
Parameter name: sourceTimeZone"

Nie wiem dlaczego to rozumiem.

Próbowałem 2 sposoby

 TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
 // I also tried DateTime.UtcNow
 DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); 
 var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone );

To zawiodło, więc się zmęczyłam

 DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); 
 var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, 
                                           ZoneId, TimeZoneInfo.Utc.Id);

To również zawiodło z tym samym błędem. Co ja robię źle?

Czy to zadziała?

 DateTime localServerTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
 TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(id);

 var usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);

 var utc = TimeZoneInfo.ConvertTimeToUtc(usersTime, userInfo);

Edytuj 2 @ Jon Skeet

Właśnie myślałem o tym, że może nawet nie muszę tego robić. Sprawa czasu wprawia mnie w zakłopotanie, dlatego post może nie być tak wyraźny, jak być powinien. Nigdy nie wiem, co się dzieje z tym, co się dzieje do tej pory (próbowałem zmienić strefę czasową na inną strefę czasową i nadal otrzymywałem czas lokalny).

Właśnie to chciałem zrobić. Użytkownik przychodzi na stronę, dodaje alert i jest teraz zapisywany jako utc (wcześniej był to DateTime. Teraz ktoś zasugerował przechowywanie wszystkiego UTC).

Zanim więc użytkownik wejdzie na moją stronę i będzie zależał od tego, gdzie był mój serwer hostingowy, może to być następnego dnia. Jeśli więc powiadomienie miało być pokazane 30 sierpnia (ich czas), ale z różnicą czasową serwera, mogą pojawić się 29 sierpnia, a alert zostanie wyświetlony.

Więc chciałem z tym walczyć. Więc teraz nie jestem pewien, czy powinienem po prostu zapisać ich czas lokalny, a następnie użyć tego przesunięcia? Lub po prostu zapisz czas UTC. Z chwilą zapisania czasu UTC wciąż może być źle, ponieważ użytkownik nadal prawdopodobnie będzie myślał w czasie lokalnym i nie jestem pewien, jak naprawdę działa UTC, nadal może to spowodować różnicę czasu.

Edit3

 var info = TimeZoneInfo.FindSystemTimeZoneById(id)

 DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
                                             TimeZoneInfo.Utc, info);

questionAnswers(5)

yourAnswerToTheQuestion