Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Operacje na datach
Forum PHP.pl > Forum > Przedszkole
northwest
Witam,
mam taki kod:
  1. <?php
  2. $czas = "2008-09-04 1:3:05";
  3. $dzisiaj = date("Y-m-d ::s");
  4. $nowa = $dzisiaj - $czas;
  5. ?>

chciałbym wyświetlić informację ile godzin (lub jeśli jest powyżej 24 to dni) minęło od daty $czas do dzisiaj...

Jak to najłatwiej zrobić??


Northwest
sowiq
  1. <?php
  2.    $czas = "2008-09-04::05";
  3.    preg_match("/([0-9]{4})-([0-9]{2})-([0-4]{2}) ([0-9]{1:([0-9]{1:([0-9]{1,2})/", $czas, $regs);
  4.    $date = (time() - mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1])) / (60 * 60);
  5.    echo "Minęło ";
  6.    if($date > 24)
  7.        echo floor($date / 24)." dni i ";
  8.    echo ($date % 24)." godzin";
  9. ?>


[edit]
Forum wycina cyferki w zmiennej czas winksmiley.jpg
northwest
php krzyczy na tą linie:
preg_match("/([0-9]{4})-([0-9]{2})-([0-4]{2}) ([0-9]{1:([0-9]{1:([0-9]{1,2})/", $czas, $regs);

zwraca:

Warning: preg_match() [function.preg-match]: Compilation failed: missing ) at offset 63 in C:\wamp\www\websystem\view\tabelka.php on line 79
Minelo 3213 dni i 23 godzin - czas też trooooszke zawyża;)
sowiq
Napisałem Ci wyraźnie, że forum wycięło cyferki w pierwszej linijce. Nie kopiuj bezmyślnie...

[edit]
Przepraszam, nie Twoja wina. Forum poprzestawiało całkowicie znaki w wyrażeniu regularnym :/

spróbuję tak:

<?php
$czas = "2008-09-04 1:3:05";
preg_match("/([0-9]{4})\-([0-9]{2})\-([0-4]{2}) ([0-9]{1,2})sad.gif[0-9]{1,2})sad.gif[0-9]{1,2})/", $czas, $regs);

$date = (time() - mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1])) / (60 * 60);
echo "Minęło ";
if($date > 24)
echo floor($date / 24)." dni i ";
echo ($date % 24)." godzin";
?>
northwest
$dzisiaj = date("Y-m-d H:i:s");
$czas = $query_data[czas];
preg_match("/([0-9]{4})-([0-9]{2})-([0-4]{2}) ([0-9]{1:([0-9]{1:([0-9]{1,2})/", $czas, $regs);
$date = (time() - mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1])) / (60 * 60);
echo "Minęło ";
if($date > 24); echo floor($date / 24)." dni i ";
echo ($date % 24)." godzin";


mam coś takiego, gdzie $query_data[czas] jest pobrane z MySQL
sowiq
oo, tak wyświetla ok:

  1. <?php
  2. $czas = "2008-09-04 1:3:05";
  3. preg_match("/([0-9]{4})\-([0-9]{2})\-([0-4]{2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $czas, $regs);
  4.  
  5. $date = (time() - mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1])) / (60 * 60);
  6. echo "Minęło ";
  7. if($date > 24)
  8. echo floor($date / 24)." dni i ";
  9. echo ($date % 24)." godzin";
  10. ?>


Sorry, to nie Twoja wina. Nie zauważyłem, że poprzestawiała się większość znaków w wyrażeniu regularnym, kiedy zakodowałem na forum jako PHP. Przy HTML jest ok smile.gif
barthpl
To jest dobre rozwiązanie jak się ma datę podawaną w bardzo nietypowy sposób i zarazem bardzo określony (inny format daty i się sypnie)
Kod
   $czas = "2008-09-04 1:3:05";
   preg_match("/([0-9]{4})\-([0-9]{2})\-([0-4]{2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $czas, $regs);
   $date = (time() - mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1])) / (60 * 60);


Bo przecież lepiej zamiast tego preg_match ("armaty") lepiej (chyba) skorzystać z gotowych funkcji (szwajcarskiego scyzoryka strtotime" title="Zobacz w manualu PHP" target="_manual)?
Kod
    $date = ( time() - strtotime( "2008-09-04 1:3:05" ) ) / 3600;
sowiq
@northwest,
napisałeś, że datę pobierasz z MySQL. Baza sama w sobie obsługuje operacje na datach. Zobacz to: http://dev.mysql.com/doc/refman/5.0/en/dat...-functions.html
jarek_bolo
Ale tak czy siak, gwoli ścisłości lepiej przechowywać w bazie oraz operować na timestampach jako INTEGER.
W MySQL pole typu timestamp przechowuje date w formacie rok-miesiać-dzien godz:min:sek i do tego są problemy z DST, trzeba dogrywać tabele do pobrania ze strony mysql'a (ostatnio jak tym sie bawilem w kwietniu to w takim zipie byly: mysql_timezone-2006p.zip) z aktualnymi nazwami stref czasowych i do tego ustawić należy defaultową strefe czasową bo inaczej baza korzysta z SYSTEM co np. w hostingach za granicą może być problemem.

Nawet na forum poruszyłem problem z datami w MySQLu, o tutaj: http://forum.php.pl/index.php?showtopic=94840
Niestety nie znalazłem przyczyny mojego problemu i zarzuciłem trzymanie dat w bazie w polach typu timestamp.

Lepiej jest operować datą po stronie PHP przy pomocy prostych obliczeń na timestampach, przynajmniej dla mnie smile.gif
northwest
ok,działa kod:)
ja mam swój serwer więc problemów z datami nie będę miał...chyba...smile.gif bazą jest postgresql
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.