Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]CZAS I DATA W PHP, Odpowiedzi na pytanie dotyczące manipulacji czasem w PHP
neo1986kk
post
Post #1





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


Witam, proszę pomoc w napisaniu kodu PHP, który miałby za zadanie dodawanie godzin.
To znaczy:
1) wpisuję czas początkowy w polu data i godzina... np 10-09-2009 20:00
2) zaznaczam że jade pociągiem i tu pierwszy problem bo ustalam ze pociagiem jade 80/h, samochodem 100/h, a rowerem 12/h.
3)podaje ilosc km
4)i teraz po kliknieciu na ok, chcialbym uzyskac odpowiedz:
jazda rozpocznie się o godzinie 20:00 dnia 10-09-2009, bedziesz jechał gg:mm czasu, podróż zakończy się dnia dd:mm:rrrr o godzinie gg:mm, jedziesz pociągiem.

oczywiście rzeczy typu "jedziesz pociągiem" wiem jak wpisać w skrypt, skupić się należy na tym jak obliczyć ile będę jechał i kiedy zakończy się moja podróż.
Proszę o pomoc i z góry dziękuę za podpowiedzi.
Go to the top of the page
+Quote Post
Wicepsik
post
Post #2





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


date, mktime - Wszystko czego Ci potrzeba (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował Wicepsik 10.09.2009, 18:06:29
Go to the top of the page
+Quote Post
neo1986kk
post
Post #3





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


acha, ja cały czas kombinuje z strtotime, ale odejmując czas dojazdu od czasu odjazdu wiadomo co sie dzieje... skrypt powraca do roku 1970 kiedy to dla niego jest początek, że tak powiem świata...

ale do konwersji pewnie będzie mi potrzebne zamienianie sekund na dni itd... a tu niestety jest problem bo do szkoly często nie było po drodze:P Pozdrawiam

A jeszcze takie pytanie bonusowe czy moge na jednej stronie wyświetlić klika takich podrózy?

Ten post edytował neo1986kk 10.09.2009, 18:11:51
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




No skoro coś źle się dzieje to może pokażesz kod? Tylko nie cały swój system, lecz wycinek. Oczywiście wcześniej zdebuguj dane wyjściowe (wyświetl, pokaż nam)
Go to the top of the page
+Quote Post
neo1986kk
post
Post #5





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


na początek wpisuje wszystko ręcznie także moj kod wyglada tak:
  1. <?php
  2. $a='2009-09-09 00:00';
  3. $b='2009-09-09 00:30';
  4. ?>


Ten post edytował neo1986kk 10.09.2009, 18:21:24
Go to the top of the page
+Quote Post
wookieb
post
Post #6





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




No i masz rożnicę sekund pomiędzy tymi datami. Czyli 1800 sekund. Po przeliczeniu czasu jazdy (godziny i minuty) przeliczasz na sekundy i dodajesz do daty początkowej
  1. echo date('Y-m-d H:i', (strtotime($data_poczatkowa) + czas_jazdy_w_sekundach));
Go to the top of the page
+Quote Post
neo1986kk
post
Post #7





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


No właśnie róznica w sekundach, a ja chce zeby ktos kto bedzie to czytal nie musial sobhie liczyc ze 23582358 sekund to 6:43:28 tylko mial róznice wyswietloną od razu w formie gg:mm:ss
Go to the top of the page
+Quote Post
wookieb
post
Post #8





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




Dzielić cię w szkole nie nauczono? Skoro minuta to 60 sekund a godzina to 60 minut. Stary ( z nicku prawdopodobnie masz 23 lata)... matematyka z podstawówki.

Cytat
a tu niestety jest problem bo do szkoly często nie było po drodze:P

To wracaj do podstawówki. Taki argument do nas nie przemawia.

Ten post edytował wookieb 10.09.2009, 18:43:57
Go to the top of the page
+Quote Post
neo1986kk
post
Post #9





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


nie o to chodzi...
ok mam 65 sekund jak to zapisać w postaci 00:01:05?
65/60=1 r5??
Go to the top of the page
+Quote Post
wookieb
post
Post #10





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




Masakra...
  1. $godziny = floor($czas/3600);
  2. $minuty = floor($czas/60);
  3. $sekundy = $czas%60;

i jeszcze podpowiedź http://pl2.php.net/str_pad . Nie znasz podstaw operatorów w programowaniu. Uzupełnij wiedzę.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #11





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


dzieki, juz rozumiem o co chodzi, teraz mysle ze dam rade, a jak nie to siegne po pomoc, ale najpierw uzupelnie wiedze:)
Go to the top of the page
+Quote Post
thek
post
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A po co kombinować? Strtotime zwraca Ci timestamp, czyli liczbę sekund od 1 stycznia 1970. Policz tylko ile sekund trwa podróż na X kilometrów z prędkością Y. Teraz dodaj tę liczbę do czasu startu wyświetl sformatowaną do odpowiedniej postaci.

EDIT: Wookieb mnie uprzedził bo temat miałem otwarty w dalekiej zakładce (IMG:style_emoticons/default/winksmiley.jpg) A tak do autora to liczy komp, a nie Ty więc to żadne usprawiedliwienie. Ty tylko dajesz wzór. Jeśli nawet tego nie potrafisz to nie bierz się za nic trudniejszego. Informatyka to w 50% pomysł na algorytm, a w pozostałych 50% matma w czystej postaci. Patrząc zaś na posty to brak Ci pomysłów bo idziesz po nie na forum. Zaś skoro trudność Ci sprawia nawet dzielenie przez 60 i jej potęgi to znaczy, że z matmą też u Ciebie krucho.

Ten post edytował thek 10.09.2009, 19:11:43
Go to the top of the page
+Quote Post
kefirek
post
Post #13





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Cytat(wookieb @ 10.09.2009, 19:55:33 ) *
Masakra...
  1. $godziny = floor($czas/3600);
  2. $minuty = floor($czas/60);
  3. $sekundy = $czas%60;

i jeszcze podpowiedź http://pl2.php.net/str_pad . Nie znasz podstaw operatorów w programowaniu. Uzupełnij wiedzę.


A nie powinno byc tak ?
  1. $iH = sprintf("%02d",floor((($czas%604800)%86400)/3600));
  2. $iM = sprintf("%02d",floor(((($czas%604800)%86400)%3600)/60));
  3. $iS = sprintf("%02d",floor((((($czas%604800)%86400)%3600)%60)));
Go to the top of the page
+Quote Post
wookieb
post
Post #14





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




Ale jemu chodzi o czas podróży. Czyli sekundy przeliczyć na godziny itd. I nie podawaj tutaj rozwiązania z date bo to działa tylko do 24h a to chyba trochę za mało.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #15





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


Ja rozumiem, sie denerwujecie jak patrzycie na takie pytania, ale ja dopiero zaczynam pisanie jakichkolwiek skryptów dlatego napisałem na forum o nazwie przedszkole, matematyke umiem ale poprostu nie zdaje sobie sprawy czasami jak i gdzie ją wykorzystac, dlatego prosze o wyrozumialosc i jestem wdzieczny za wszelka pomoc.
Go to the top of the page
+Quote Post
thek
post
Post #16





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Autorowi, jeśli dobrze czytałem posta, chodzi o obie rzeczy, bo pisze: ruszyłeś gdy była X i pojedziesz Y czasu, a będziesz na miejscu o czasie Z. Czyli użycie wszystkiego co tu opisaliśmy będzie mu potrzebne. Ewentualnie bym zdefiniował sobie tablicę kilku liczb by szybko robić przeliczenia na tygodnie(choć te nie muszą wystąpić), dni, godziny, minuty i sekundy. Dzielimy liczbę przez kolejne z nich od największej. Jeśli większe lub równe 1 to wyświetlamy część całkowitą, a resztę z dzielenia przepychamy do niższej w skali liczby i powtarzamy. Co da nam ostatecznie czas podróży. Czas dotarcia to już prościzna o jakiej pisaliśmy z wookieb. Dodanie sekund do strtotime i wynik potraktować sformatowanym date. Rzucę przykład bo zawsze to lepiej widać.
Tablica: 604800, 86400, 3600, 60
3957884 sekund podróży to:
3957884/604800 = 6 tygodni i 329084 sekund reszty
329084/86400 = 3 dni i 69884 sekund reszty
69884/3600 = 19 godzin i 1484 sekund reszty
1484/60 = 24 minuty i 44 sekundy reszty

Z tego się prostą funkcję da napisać w stylu:
  1. function licz ($sekundy) {
  2. $temp[] = $sekundy;
  3. $dzielniki = array(604800, 86400,3600, 60);
  4. for($i=0; $i<4; $i++ ) {
  5. $temp[] = $temp[$i]%$dzielniki[$i];
  6. $temp[$i] = floor($temp[$i]/$dzielniki[$i] );
  7. }
  8. return $temp;
  9. }

Czy coś w ten deseń...

Ten post edytował thek 10.09.2009, 20:52:59
Go to the top of the page
+Quote Post
CyberDuck_
post
Post #17





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

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


Panowie bez nerw (IMG:style_emoticons/default/smile.gif) Czlowiek przyszedl tu po pomoc i chce
sie czegos nauczyc. Najlepiej jesli da tu juz swojego gotowca, a
my na spokojnie/konstruktywnie to rozpiszemy co mogl inaczej
i co mozna zmienic. No i jesli juz piszecie cokolwiek to ciut
wyzej na jego poziomie bo moj poprzednik chyba troszke
przesadzil z ta funkcja (IMG:style_emoticons/default/smile.gif) On nie rozumie date() i mktime(), a
ten mu juz zasadzil funkcje i return (IMG:style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
thek
post
Post #18





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Może i przesadziłem nieco, ale oprócz funkcji dałem przykład jak działa ona krokowo, więc myślę, że zrozumiała jest ona dzięki temu nawet dla żółtodziobów (IMG:style_emoticons/default/winksmiley.jpg)
A jeśli komuś innemu się przyda to też będzie fajnie, choćby do rozszerzenia możliwości helpera operacji na datach we frameworku.
Rzuciłem to też by widział jak się matematykę stosuje w praktyce. Funkcyjka jest prosta, więc można łatwo prześledzić co i jak. Dzięki temu choć nieco podstawy pisania funkcji pozna.
Go to the top of the page
+Quote Post
neo1986kk
post
Post #19





Grupa: Zarejestrowani
Postów: 561
Pomógł: 3
Dołączył: 2.02.2009

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


Mi to bardzo pomogło. Problem leżał w tym, że ja chciałem zwrócić całą godzinę w formacie gg:mm i nie przyszło mi dogłowy żeby godziny zapisać do x a minuty do y i wyświetlić to jak x:y. Beznadziejnie przez 2 dni szukałem funkcji, która mi to wykona, a co się okazało temat jest banalnie prosty. Teraz mam inny problem nie do przeskoczenia. Bo moj program nie uwzględnia tego, że mój środek lokomocji może się np. zepsuć i wtedy nie dojade o określonym czasie. Domyślam się, że do tego potrzebowałbym jakiś licznik, który na bierząco będzie dodawał ilość kilometrów dzieląc to przez czas, ale niestety nie mam takich urządzeń i w tej sytuacji leżę. Chyba, że ktoś z was ma pomysł jak to obejść ale jakoś sensownie, a nie tak żeby wpisywać co kilometr, że rzeczywiście go przejechałem:P Pozdrawiam
P.S. a wiecie może co zrobić, żeby po odświeżeniu nie wyskakiwało okienko informujące o przeładowaniu strony? Troche denerwujące...

Ten post edytował neo1986kk 11.09.2009, 22:58:42
Go to the top of the page
+Quote Post
CyberDuck_
post
Post #20





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

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


Wlacz automatyczne odswierzanie co okreslony czas.
Zeby to zrobic bardzo elegancko musialbys zrobic sobie ramke i
w niej dokonywac wszystkich obliczen, a wynik wyswietlac
na stronie bez jej odswierzania.
Przed tym wszystkim musialbys zapisac soobie do sesji dane, ktore
Ci sa potrzebne i za kazdym odswierzeniem je aktualizuj.
Przed samym formularzem sprawdzaj czy dane wynikowe sa
wypelnione i jesli tak to chowasz formularz, a jesli nie to
formularz sie wyswietla.

Do tego potrzebne Ci bedzie :
session_start();
no i same zmienne sesji ... :
  1. $_SESSION['zmienna'] = 'wynik';


Z tymi ramkami to moze jeszcze poczekaj (IMG:style_emoticons/default/smile.gif) , ale ja cos takiego
juz robilem i calkiem przyjemnie to wychodzi. Na stronie mozna
obserwowac zmieniajace sie dane, bez jej odswierzania.
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: 23.08.2025 - 21:42