Różnica czasu pomiedzy Java i C#

0

Nie wiedziałem gdzie to napisać więc zrobiłem to w tym podforum.

Mój program pisany w C# dostaje pakiet od serwera pisanego w javie z aktualnym czasem na serwerze, serwer pobiera go za pomocą klasy Calendar.getInstance().getTimeInMillis() a mój program DateTime.Now.Ticks, wszystko pięknie, tylko zauważyłem że czas serwera co około godzinę cofa się o 100ms w porównaniu z moim czasem, nie wiem co jest tego przyczyną.
Czy ma to coś wspólnego z tym że są to dwa różne języki? Proszę o informacje.

0

Aha dodam jeszcze że serwer jest w Rosji a ja oczywiście w Polsce, jeśli to coś zmienia ;]

0

Odległość? Można zauważyć np. w grach (pisanych w jednym języku) że jeżeli spotka się dwóch graczy z dwóch krańców świata, to będą mieli poważne kłopoty z synchronizacją. Rosja jest tak duża, że "serwer jest w Rosji" to za mało powiedziane. Może być i w Kaliningradzie, i na Władywostoku.

0

po prostu "uczciwi" producenci specjalnie dają troszkę wolniejsze wzorce czasu, by troszkę lepiej wypadać w testach.
Gdyby próbowali robić dokładne zegary, a to by był problem dokładności produkcji, to trafiałyby się takie komputery, których zegary się spieszą. Ja takiego nigdy nie spotkałem. Mój rekordzista gubił pół godziny na tydzień przy braku synchronizacji z internetu.

0
norbi452 napisał(a):

Odległość? Można zauważyć np. w grach (pisanych w jednym języku) że jeżeli spotka się dwóch graczy z dwóch krańców świata, to będą mieli poważne kłopoty z synchronizacją. Rosja jest tak duża, że "serwer jest w Rosji" to za mało powiedziane. Może być i w Kaliningradzie, i na Władywostoku.

Gdyby był to problem synchronizacji to bym nie prosił o pomoc, to jest problem z różnicą czasu, ten czas nie różni sie o ileś ms tylko ciagle maleje, bez przerwy, po prostu sprawdzasz czas dzis i jest roznica np o 20sekund, wchodzisz nastepnego dnia i jest już 22sekundy.

0
MarekR22 napisał(a):

po prostu "uczciwi" producenci specjalnie dają troszkę wolniejsze wzorce czasu, by troszkę lepiej wypadać w testach.
Gdyby próbowali robić dokładne zegary, a to by był problem dokładności produkcji, to trafiałyby się takie komputery, których zegary się spieszą. Ja takiego nigdy nie spotkałem. Mój rekordzista gubił pół godziny na tydzień przy braku synchronizacji z internetu.

Aha czyli NIE MA możliwości żeby dowiedzieć się jaka to jest różnica w jakim odstępie czasu?

0
takisobiektos napisał(a):

Gdyby był to problem synchronizacji to bym nie prosił o pomoc, to jest problem z różnicą czasu, ten czas nie różni sie o ileś ms tylko ciagle maleje, bez przerwy, po prostu sprawdzasz czas dzis i jest roznica np o 20sekund, wchodzisz nastepnego dnia i jest już 22sekundy.

Masz problem z różnicą czasu, bo masz rozjechane zegary, więc to jest problem synchronizacji. Druga możliwość to skopany kod, bez którego nic nie wywróżymy.

0

W systemach rozproszonych nie mozesz liczyc na to, ze komputery beda mialy idealnie zsynchronizowane zegary. Jezeli potrzebujesz tych timestampow do ustalenia kolejnosci zdarzen to mozesz uzyc Vector Clockow.

0
kult napisał(a):
takisobiektos napisał(a):

Gdyby był to problem synchronizacji to bym nie prosił o pomoc, to jest problem z różnicą czasu, ten czas nie różni sie o ileś ms tylko ciagle maleje, bez przerwy, po prostu sprawdzasz czas dzis i jest roznica np o 20sekund, wchodzisz nastepnego dnia i jest już 22sekundy.

Masz problem z różnicą czasu, bo masz rozjechane zegary, więc to jest problem synchronizacji. Druga możliwość to skopany kod, bez którego nic nie wywróżymy.

DateTime.Parse("1970-1-1 00:00:00").AddMilliseconds(CzasWMsWyciagnietyZPakietuSerwera).ToLocalTime().Ticks / 10000; // Tak ustalam czas odebrany z serwera
DateTime.Now.Ticks / 10000; // A tak swój własny

NIE MA tutaj gdzie wystąpić błąd, a aktualna różnica w czasie miedzy mną a serwerem to 10sekund, i z dnia na dzień rośnie.
"rozjechane zegary" mi nic nie mówi, żaden pojazd mi nie jeździł po monitorze ;p

0

Chodzi o to, że komputer ten czas musi sobie skądś wziąć, a bierze go najczęściej z zegara RTCC umieszczonego na płycie głównej. Zegar ten jest stabilizowany rezonatorem kwarcowym, który nie jest idealny. Można jednak ten czas synchronizować z zegarem atomowym, który ma bardzo dobrą dokładność, umożliwia to np protokół NTP, używany zarówno przez Linuksa jak i Windowsa. Sprawdź to.

0

Można obydwa komputery synchronizować z serwera ntp, wtedy będą miały taki sam czas.

0

Problem w tym że nie mam dostępu do serwera więc nic z nim zrobić nie mogę :/
Ale z tego co piszecie wnioskuje że w takim razie nie mogę zsynchronizować dokładnie mojego czasu z serwerowym więc chyba będę musiał pozostać przy tym co aktualnie posiadam.

0

Skoro wiesz, ze co godzine serwer lapie 100ms opoznienia mozesz obliczyc poprawke do czasu na zasadzie:
prawdziwy_czas = czas_serwera + 100ms * liczba_godzin_od_momentu_kiedy_zegary_byly_zsynchronizowane

0
0x200x20 napisał(a):

Skoro wiesz, ze co godzine serwer lapie 100ms opoznienia mozesz obliczyc poprawke do czasu na zasadzie:
prawdziwy_czas = czas_serwera + 100ms * liczba_godzin_od_momentu_kiedy_zegary_byly_zsynchronizowane

Przez zostanie przy tym co mam to właśnie miałem na myśli ;p
Ale dzięki za odp :)

0

Robiłeś test, który o np. godzinie 20:00 czasu lokalnego pobiera czas z serwera i następnego dnia o tej 20:00 czas ten był różny o 4800 ms?
Czy po prostu pobierasz czas co godzinę i dodajesz różnicę? Jeśli tak drobne błędy będą się nakładać. IMO w aplikacjach sieciowych rozjechanie o 200ms nie ma znaczenia, nic ci nie szkodzi odpytywać serwer co np. 15 min. i go korygować.
Pomiędzy odebraniem pakietu a obliczaniem czasu robisz coś jeszcze? Może pobierz czas lokalny tylko raz do zmiennej przed wyliczeniem różnicy zamiast po obliczeniu serwerowego a najlepiej zaraz po odebraniu pakietu. Pakiet pomiędzy wysłaniem a odebraniem też musi mieć czas na "podróż" i nie jest stały.

0
szopenfx napisał(a):

Robiłeś test, który o np. godzinie 20:00 czasu lokalnego pobiera czas z serwera i następnego dnia o tej 20:00 czas ten był różny o 4800 ms?
Czy po prostu pobierasz czas co godzinę i dodajesz różnicę? Jeśli tak drobne błędy będą się nakładać. IMO w aplikacjach sieciowych rozjechanie o 200ms nie ma znaczenia, nic ci nie szkodzi odpytywać serwer co np. 15 min. i go korygować.
Pomiędzy odebraniem pakietu a obliczaniem czasu robisz coś jeszcze? Może pobierz czas lokalny tylko raz do zmiennej przed wyliczeniem różnicy zamiast po obliczeniu serwerowego a najlepiej zaraz po odebraniu pakietu. Pakiet pomiędzy wysłaniem a odebraniem też musi mieć czas na "podróż" i nie jest stały.

Tak codziennie sprawdzałem o tej samej godz i się różnił coraz bardziej, ze strony mojego programu nie może być z tym problemu bo tak jak napisałem zbyt wiele kodu do przetworzenia NIE MA, no i robię to od razu po otrzymaniu pakietu zresztą codzienne zwiększanie różnicy mówi samo za siebie ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1