Przechowuję wszystkie moje daty w formacie UTC w mojej bazie danych. Pytam użytkownika o strefę czasową i chcę korzystać z ich strefy czasowej oraz tego, co zgaduję, to czas serwera, aby dowiedzieć się o UTC dla nich.Masz problemy z konwersją mojego DataTime na UTC
Kiedy już to zrobię, chcę przeprowadzić wyszukiwanie, aby zobaczyć zakres w bazie danych za pomocą 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);
ta nie powiodła się, więc zmęczony
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now,
ZoneId, TimeZoneInfo.Utc.Id);
To również nie zarówno z tego samego błędu. Co ja robię źle?
Czy to działałoby?
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);
Edycja 2 @ Jon Skeet
Ya Myślałem właśnie o to, że nie może nawet trzeba to wszystko zrobić. Czas rzeczy wprawia mnie w zakłopotanie właśnie teraz, dlatego post może nie być tak wyraźny, jak być powinien. Nigdy nie wiem, co do diaska DateTime.Now jest coraz (próbowałem zmienić moją strefę czasową na inną strefę czasową i to ciągle otrzymywałem mój lokalny czas).
Oto, co chciałem zrobić. Użytkownik przychodzi do witryny dodaje pewien alert i jest teraz zapisywany jako utc (zanim był DateTime. Teraz ktoś zasugerował, aby przechowywać wszystko UTC).
Więc zanim użytkownik przyjdzie do mojej witryny iw zależności od tego, gdzie był mój serwer hostingowy, może być jak następnego dnia. Tak więc, jeśli powiadomiono o wyświetleniu alertu 30 sierpnia (czasu), ale z różnicą czasu serwera, mogły pojawić się 29 sierpnia, a alarm zostanie wyświetlony.
Więc chciałem walczyć z tym. Więc nie jestem pewien, czy powinienem przechowywać ich czas lokalny, a następnie użyć tego offsetu? Lub po prostu przechowuj czas UTC. Po prostu przechowywanie czasu UTC wciąż może być nie tak, ponieważ użytkownik prawdopodobnie prawdopodobnie myślałby w czasie lokalnym i nie jestem pewien, jak działa UTC, ale i tak może skończyć się różnica czasu.
Edit3
var info = TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
TimeZoneInfo.Utc, info);
'DateTime.Now.Kind' jest już' Lokalny'; nie musisz wywoływać na nim 'SpecifyKind'. – SLaks
@Edit 2: Przechowuj powiadomienia w UTC i wyświetlaj je w strefie czasowej podanej przez użytkownika, jak pokazano w mojej odpowiedzi. – dtb
Jak to działa? Dostaję DateTime.UtcNow, a następnie filtrować alerty z db? następnie przekonwertować znalezione wyniki na ich czas lokalny? – chobo2