Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] unixtime / dni / unixtime /dni o_0
paw-e-l
post
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 23
Dołączył: 27.06.2009
Skąd: Jaworzno

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
sadistic_son
post
Post #2





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Usuń floor i wszystko bangla jak należy (IMG:style_emoticons/default/guitar.gif)
  1. $day = $time/86400;


Ten post edytował sadistic_son 5.10.2009, 01:44:22
Go to the top of the page
+Quote Post
paw-e-l
post
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 23
Dołączył: 27.06.2009
Skąd: Jaworzno

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


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
Go to the top of the page
+Quote Post
cojack
post
Post #4





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Po cholerę tam mnożysz a tu dzielisz? Robisz 2x jedno i to samo?
Go to the top of the page
+Quote Post
MateuszS
post
Post #5





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


zamiast
$day = floor($time/86400);

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

choc rozwiazanie sadistic_son wydaje sie lepsze ;p

Ten post edytował MateuszScirka 5.10.2009, 21:22:03
Go to the top of the page
+Quote Post
paw-e-l
post
Post #6





Grupa: Zarejestrowani
Postów: 115
Pomógł: 23
Dołączył: 27.06.2009
Skąd: Jaworzno

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


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 (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował paw-e-l 5.10.2009, 22:41:29
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg) [do całości - czyli reszty masz 86400-7200=79200s które floor wyrzuci (IMG:style_emoticons/default/winksmiley.jpg) ] - i w sumie na to przybliżenie to jest zależne od pory dnia (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg) ] okrężną drogą dodając do całości - floor działa tak że jak masz 1,9 to otrzymasz 1 (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował zegarek84 5.10.2009, 23:17:15
Go to the top of the page
+Quote Post
paw-e-l
post
Post #8





Grupa: Zarejestrowani
Postów: 115
Pomógł: 23
Dołączył: 27.06.2009
Skąd: Jaworzno

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


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ę (IMG:style_emoticons/default/winksmiley.jpg) chyba zbiłem was trochę z tropu niepotrzebnie w date() podając 'G:m' (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.
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: 14.09.2025 - 18:24