Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]CZAS I DATA W PHP
Forum PHP.pl > Forum > Przedszkole
neo1986kk
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.
Wicepsik
date, mktime - Wszystko czego Ci potrzeba winksmiley.jpg
neo1986kk
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?
wookieb
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)
neo1986kk
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. ?>
wookieb
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));
neo1986kk
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
wookieb
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.
neo1986kk
nie o to chodzi...
ok mam 65 sekund jak to zapisać w postaci 00:01:05?
65/60=1 r5??
wookieb
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ę.
neo1986kk
dzieki, juz rozumiem o co chodzi, teraz mysle ze dam rade, a jak nie to siegne po pomoc, ale najpierw uzupelnie wiedze:)
thek
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 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.
kefirek
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)));
wookieb
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.
neo1986kk
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.
thek
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ń...
CyberDuck_
Panowie bez nerw 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 smile.gif On nie rozumie date() i mktime(), a
ten mu juz zasadzil funkcje i return blinksmiley.gif
thek
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 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.
neo1986kk
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...
CyberDuck_
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 smile.gif , ale ja cos takiego
juz robilem i calkiem przyjemnie to wychodzi. Na stronie mozna
obserwowac zmieniajace sie dane, bez jej odswierzania.
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.