Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] unixtime / dni / unixtime /dni o_0
Forum PHP.pl > Forum > Przedszkole
paw-e-l
z góry przepraszam że zawracam wam głowę takimi pierdołami ale na tę chwilę utknąłem
  1. $time = '1254697863'; // jakaś data w formacie unixowym
  2. echo 'unix: '.$time.' date: '.date('G:m j.m.Y', $time).'<br />';
  3. $day = floor($time/86400);
  4. echo 'day: '.$day.' unix from day: '.($day*86400).' date from day: '.date('G:m j.m.Y', $day*86400);


już tłumaczę o co tu chodzi. otóż w linii 3 obliczam numer dnia od początku ery unixowej. w linii 4 idę w drugą stronę, przeliczam ilość dni na sekundy a następnie wyświetlam datę. no i tutaj zonk sciana.gif zamierzonym wynikiem była data taka sama jak na początku skryptu a wyszła przesunięta o dzień. wydedukowałem że przesunięcie tak naprawdę wynosi 2 godziny tylko skąd to się bierze i jak to rozwiązać (oczywiście bez dodawania tych 2 godzin)?

P.s. zważywszy na późną porę proszę o wyrozumiałość jeśli ten post nie ma sensu winksmiley.jpg
sadistic_son
Usuń floor i wszystko bangla jak należy guitar.gif
  1. $day = $time/86400;
paw-e-l
tylko że potrzebuje numeru dnia jako integer bo zapisuje do bazy jako unikalny identyfikator dnia (musi być integer), a później z powrotem zamieniam na date
cojack
Po cholerę tam mnożysz a tu dzielisz? Robisz 2x jedno i to samo?
MateuszS
zamiast
$day = floor($time/86400);

daj
$day=round($time/8640, 0);

choc rozwiazanie sadistic_son wydaje sie lepsze ;p
paw-e-l
Cytat(cojack @ 5.10.2009, 22:13:45 ) *
Po cholerę tam mnożysz a tu dzielisz? Robisz 2x jedno i to samo?


otóż są to 2 fragmenty kodu
  1. najpierw przeliczam unixtime na dzień (np dzisiaj mamy 14522 dzień ery unixowej). ten unikalny numer dla każdego dnia pozwala mi zapisywać w bazie statystyki, np dzienną ilość wyświetleń jakiejś podstrony. dzięki temu mogę łatwo sortować zasoby np wg. sumy wyświetleń z jakiegoś przedziału dni.
  2. problem występował (tak mi się wydawało) w drugiej części podanego kodu gdzie przeliczam dzień (np 14522) na normalną datę. tutaj występowało przekłamanie o 2 godziny o czym wspomniałem wcześniej.


źródłem tego przesunięcia okazała się jednak pierwsza część kodu (unixtime na dzień). rozwiązałem to tak
  1. $day = floor((time()+7200)/86400)

działa tak jak powinno choć pewnie nigdy się nie dowiem dlaczego muszę dodawać 7200s żeby było ok.

@up, round() nie wchodzi w gre gdyż obliczanie numeru dnia w ten sposób w godzinach południowych dawałoby dzień następny winksmiley.jpg
zegarek84
Cytat(paw-e-l @ 5.10.2009, 23:31:16 ) *
źródłem tego przesunięcia okazała się jednak pierwsza część kodu (unixtime na dzień). rozwiązałem to tak
  1. $day = floor((time()+7200)/86400)

działa tak jak powinno choć pewnie nigdy się nie dowiem dlaczego muszę dodawać 7200s żeby było ok.

Cytat(PHP_manual_-_pl.php.net)
Cytat
float floor ( float $value )

Returns the next lowest integer value by rounding down value if necessary.

chciałeś liczby całkowite to masz ale bez tego co jest po przecinku winksmiley.jpg - no, a, że dopiero od tej wartości chcesz wrócić do początkowej to brakuje Ci tego po przecinku i:
2*60*60 [2h * 60min * 60s] = 7200s winksmiley.jpg [do całości - czyli reszty masz 86400-7200=79200s które floor wyrzuci winksmiley.jpg] - i w sumie na to przybliżenie to jest zależne od pory dnia winksmiley.jpg
Cytat( @ 5.10.2009, 23:31:16 )
@up, round() nie wchodzi w gre gdyż obliczanie numeru dnia w ten sposób w godzinach południowych dawałoby dzień następny

odpowiedź na jedno z pytań już dostałeś, trochu znowu już wypiłem więc nie chce mi się analizować przykładu ale to są podstawowe równania matematyczne - i tak to traktuj a dopiero potem do tego dobieraj funkcje lub w razie potrzeby pisz własne winksmiley.jpg
ps. a po co próbujesz potem $day*86400 skoro chcesz uzyskać wartość $time?? - błąd Ci wskazałem już ale teraz pytanie po co niepotrzebnie obliczasz to co już masz w jednej ze zmiennych??

poza tym obliczasz:
date('G:m j.m.Y', $time)
a niżej date('G:m j.m.Y', $day*86400) i chcesz uzyskać ten sam wynik to może obliczył byś to raz i wrzucił to do jakiejś zmiennej a potem wyświetlał jej wartość?? - tak wiem - wyniki mogą być różne przez to przybliżenie floor - choć tak wiem teraz to "naprawiłeś" [dla mnie to nie jest naprawa problemu - trzeba problem zrozumieć a nie tylko łatać dziury a potem dziurę na dziurze winksmiley.jpg] okrężną drogą dodając do całości - floor działa tak że jak masz 1,9 to otrzymasz 1 winksmiley.jpg
paw-e-l
Cytat
poza tym obliczasz:
date('G:m j.m.Y', $time)
a niżej date('G:m j.m.Y', $day*86400) i chcesz uzyskać ten sam wynik


nie pisałem że chcę uzyskać ten sam wynik tylko tę samą datę winksmiley.jpg chyba zbiłem was trochę z tropu niepotrzebnie w date() podając 'G:m' tongue.gif
chyba muszę w praktyczny sposób rozpisać o co mi chodziło z tymi dniami itd.
otóż mam statyczną metodę której zadaniem jest podawanie tego samego numeru dnia przez cały dzień od godziny 0:00 do 24:00
  1. class date extends date_Core {
  2. public static function day_number() {
  3. return floor((time()+7200)/86400); // 7200 to fix przesunięcia czasu
  4. }
  5. }
(tak piszę na kohanie winksmiley.jpg )

problem polegał na tym że metoda zwracała ten sam numer dnia w godzinach 2:00 do 2:00 (to jest właśnie to przesunięcie 2h=7200h o którym pisałem).
po dodaniu tych 2h (time()+7200) otrzymuję ten sam numer dnia w prawidłowych godzinach od 0:00 do 24:00. mam nadzieję że teraz rozwiałem wątpliwości dlaczego użyłem floor() a nie round().

idąc dalej pokażę po co wogóle mi to wyliczanie numeru dnia.
  1. $this->db->query('UPDATE daily_views SET views=views+1 WHERE podstrona_id=123 AND day='.date::day_number());

to jest fragment kodu podstrony który jak można się domyślić inkrementuje ilość dziennych wyświetleń dla danej podstrony.
gdybym nie dodawał tych 2h w metodzie obliczającej dzień, ilość dobowych wyświetleń była by sumą wyświetleń między godzinami 2:00 i 2:00 a nie jak logika nakazuje między 0:00 i 24:00.

reszta kodu zaprezentowanego w pierwszym poście jest nieistotna gdyż służy tylko do przeliczania numeru dnia na normalną datę i to działa jak powinno.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.