Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JS/Data] Dziwne zachowanie przy wyliczaniu daty
fragles
post
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


Robię kalendarz, który min ma wyliczać datę oddaloną o okres czasu

Działa to mniej więcej jak poniższy przykład
1)na podstawie danych początkowych (ustawienie w selektach) i kliknięciu w kalendarz określam datę początku okresu
2)wiem ile dany okres ma dni
3)obliczam datę końca okresu w sposób następujący
3.1)parsuję datę początku do milisekund (Date.parse())
3.2)dodaję do tej liczby milisekund tylę milisekund ile zawiera się w dniach okresu (np 6 dni to 6*86400000)
3.3)na tej podstawie mam datę końcową

Kod
milisekundy = Date.parse(startDate);
   return new Date(milisekundy +dni*86400000)


niby nic wielkiego - a pojawił się problem

ZESTAW 1
WEJŚCIE
1)Data - 6 października 2009
2)Okres - 6 dni
WYJŚCIE (jaka data za 6 dni)
1)Data - 12 października 2009
2)Różnica między datami - 6 dni

ZESTAW 2
WEJŚCIE
1)Data - 20 października 2009
2)Okres - 6 dni
WYJŚCIE (jaka data za 6 dni)
1)Data - 25 października 2009
2)Różnica między datami - 5 dni

co widać na przykładowych alertach

http://img522.imageshack.us/img522/6065/datap.jpg

nie wiem czemu, ale właśnie na tej 20 się wykrzacza, gdy początek jest inny to jest OK -

co ciekawe problem zaczyna się przy cyfrze 6 i jak na razie dla tej daty (20 października 2009) - gdy dodaję 1-5 jest OK powyżej jest jeden dzień mniej, gdy dodaję do innej daty - wcześniejszej, późniejszej to jest OK - ale jak się raz pojawiło, może i drugi, gdzieś indziej dla innej konfiguracji - czemu tak jest, jak można temu zaradzić?

Ten post edytował fragles 11.10.2009, 20:26:48
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A mnie się wydaje, że drugi problem jest związany ze zmianą czasu, która teraz nastąpi... 25 października, spróbuj dodać 3601 sekund więcej.

Ja bym jeszcze spróbował pobawić się z funkcjami typu getUTCseconds itd.
Go to the top of the page
+Quote Post
fragles
post
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


dzięki własnie na to wpadłem
- siedziałem nad tym sporo, napisałem na forum i się mi przypomniało, że jest zmiana czasu - na razie poradziłem sobie w następujący sposób

1)tworzę pomocniczą datę dla końca okresu
tmpDate2 = new Date(msec+(arguments[0]*86400000));

2)Określam różnicę stref czasowych między datami - możliwe wyniki to -60 (ZIMOWY->LETNI) 0 (TEN SAM CZAS) 60 (LETNI->ZIMOWY)
diff=(Math.abs(tmpDate.getTimezoneOffset())-Math.abs(tmpDate2.getTimezoneOffset()));

3)przy zmianie czasu z letniego na zimowy dodaję dzień jako ilość milisekund
new Date((msec+(arguments[0]*86400000))+(diff?(diff>0?86400000:0):0))

pobieżnie sprawdziłem dla października i marca - i wyniki są prawidłowe

nie wiem czy to rozwiązanie jest najlepsze, jakby ktoś miał inne, lepsze, szybsze itp to chętnie zobaczę
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A próbowałeś pobawić się czasem uniwersalnym?
https://developer.mozilla.org/pl/Dokumentac....5/Obiekty/Date -> UTC

Wydaje mi się, że tam powinno być ok.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.09.2025 - 00:07