Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
mop
Δημοσιεύσεις: 1
Εγγραφή: 04 Μάιος 2008 00:53

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από mop » 04 Μάιος 2008 01:15

Καλησπέρα :)

Θελω να εμφανίζω σε μια ιστοσελίδα πόσες μέρες, ώρες και λεπτά πέρασαν από την τελευταία είσοδο ενός χρήστη σε αυτή.

Η ημερομηνία που μπήκε ο χρήστης τελευταία φορά είναι σε unix_timestamp και έστω ότι βρίσκεται στη μεταβλητή $last_time (πχ $last_time =1209556452)
Την σημερινή ημερομηνία μπορώ να την πάρω με την συνάρτηση time()
(πχ $current_date = time())

Στη συνέχεια τι πρέπει να κάνω για να έχω το αποτέλεσμα που θέλω;

Ευχαριστώ

alexsoft

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από alexsoft » 04 Μάιος 2008 01:57

βρήκα εύκαιρο από το phpclasses.org τον παρακάτω τρόπο με τον οποίο όμως πρέπει να μετατρέψεις πρώτα τις ημερομηνίες σε datetime.

Δουλεύει σε PHP >= 5.0

Κώδικας: Επιλογή όλων

<?php
class Date_Diff
&#123;
  public $dateFrom    ;
  public $dateTo      ;
  private $intDays    ;
  private $intHours   ; 
  private $intMinutes ;
  private $sError     ;

  function __construct&#40; $dateFrom , $dateTo &#41;
  &#123;
    $from = $this->isValidDate&#40;$dateFrom&#41;;
    $to   = $this->isValidDate&#40;$dateTo&#41;; 

    if&#40; $from && $to &#41;
    &#123; $this->setDate_Diff&#40; $from , $to &#41;; &#125;
  &#125;

  public function getError&#40;&#41;
  &#123;
    return "Invalid date format from dateFrom or dateTo."; 
  &#125;

  private function setDate_Diff&#40; $from = array&#40;&#41; , $to = array&#40;&#41; &#41;
  &#123;
   //$date1 = time&#40;&#41;;
   //$date2 = mktime&#40;0,0,0,02,29,2008&#41;;
   //$dateDiff = $date1 - $date2;
    $dateDiff = mktime&#40; $from&#91;'hour'&#93;  , $from&#91;'minutes'&#93; , $from&#91;'seconds'&#93; , 
                        $from&#91;'month'&#93; , $from&#91;'day'&#93;     , $from&#91;'year'&#93; &#41; -
                mktime&#40; $to&#91;'hour'&#93;    , $to&#91;'minutes'&#93;   , $to&#91;'seconds'&#93; ,
                        $to&#91;'month'&#93;   , $to&#91;'day'&#93;       , $to&#91;'year'&#93; &#41;;
    $this->intDays    = floor&#40;  $dateDiff / &#40;60*60*24&#41; &#41;;
    $this->intHours   = floor&#40; &#40;$dateDiff - &#40;$this->intDays*60*60*24&#41; &#41; / &#40;60*60&#41; &#41;;
    $this->intMinutes = floor&#40; &#40;$dateDiff - &#40;$this->intDays*60*60*24&#41; - &#40;$this->intHours*60*60&#41; &#41; /60 &#41;;
  &#125;

  private function isValidDate&#40; $sDate = "12/11/2008 00&#58;00&#58;00" &#41;
  &#123;
    $dateString = split&#40; " "    , $sDate      &#41;;
    $dateParts  = split&#40; "&#91;/-&#93;" , $dateString&#91;0&#93; &#41;;
    $dateParts2 = split&#40; "&#91;&#58;&#93;"  , $dateString&#91;1&#93; &#41;;

    if&#40; !checkdate&#40;$dateParts&#91;0&#93;, $dateParts&#91;1&#93;, $dateParts&#91;2&#93;&#41; &#41; 
    &#123;  return false; &#125;
    return array
           &#40; 
             'month'   => $dateParts&#91;0&#93; , 
             'day'     => $dateParts&#91;1&#93; ,
             'year'    => $dateParts&#91;2&#93; ,
             'hour'    => $dateParts2&#91;0&#93; ,
             'minutes' => $dateParts2&#91;1&#93; ,
             'seconds' => $dateParts2&#91;2&#93;
           &#41;;
  &#125;

  public function getDiffInDays&#40;&#41;
  &#123; return $this->intDays;    &#125;

  public function getDiffInHours&#40;&#41;
  &#123; return $this->intHours;   &#125;
  
  public function getDiffInMinutes&#40;&#41;
  &#123; return $this->intMinutes; &#125;

  function __destruct&#40;&#41;
  &#123;
    unset&#40;$this->dateFrom&#41;;
    unset&#40;$this->dateTo&#41;;
    unset&#40;$this->intDays&#41;;
    unset&#40;$this->intHours&#41;;
    unset&#40;$this->intMinutes&#41;; 
  &#125;
&#125;


?>




USE:

Κώδικας: Επιλογή όλων

<?php
require_once 'class.Date_Diff.php';
$date = new Date_Diff&#40; '02/01/2007 23&#58;02&#58;01', '01/31/2007 22&#58;01&#58;01' &#41;;
echo "&#91;DAYS&#93;--->".$date->getDiffInDays&#40;&#41; ."\n&#91;HOURS&#93;--->".$date->getDiffInHours&#40;&#41; ."\n&#91;MINS&#93;-->".$date->getDiffInMinutes&#40;&#41;."\n&#91;SEC&#93;-->";


?>


Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από MaZz » 04 Μάιος 2008 17:45

Function:

Κώδικας: Επιλογή όλων

<?php

function ts_diff&#40;$last_ts, $current_ts&#41; &#123;
	$date_diff = $current_ts - $last_ts;

	$periods = array&#40;
		'year'		=>		31556926,
		'month' 	=> 		2629743.83,
		'day'		=> 		86400,
		'hour'		=> 		3600,
		'minute' 	=> 		60,
		'second' 	=> 		1,
	&#41;;

	$seconds = $date_diff;
	$duration = array&#40;&#41;;

	foreach &#40;$periods as $key => $val&#41; &#123;
		$duration&#91;$key&#93; = floor&#40;$seconds / $val&#41;;
		$seconds %= $val;
	&#125;
	
	return $duration;
&#125;

?>
Παράδειγμα:

Κώδικας: Επιλογή όλων

$last_timestamp = 1209556452;
$current_timestamp = time&#40;&#41;;

header&#40;"Content-type&#58;text/plain"&#41;;
print_r&#40;ts_diff&#40;$last_timestamp, $current_timestamp&#41;&#41;;
Αποτέλεσμα:

Κώδικας: Επιλογή όλων

Array
&#40;
    &#91;year&#93; => 0
    &#91;month&#93; => 0
    &#91;day&#93; => 4
    &#91;hour&#93; => 1
    &#91;minute&#93; => 49
    &#91;second&#93; => 5
&#41;
Υ.Γ. Τις περιόδους τις πήρα από το google.
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cherouvim » 04 Μάιος 2008 19:18

Ωραία. Και η δικιά μου εκδοχή:

Κώδικας: Επιλογή όλων

<?
$time_magnitudes = array&#40;
    'day'    => 60 * 60 * 24,
    'hour'   => 60 * 60,
    'minute' => 60,
    'second' => 1
&#41;;
function getHumanFriendlyTime&#40;$seconds&#41; &#123;
    global $time_magnitudes;
    $result = "";
    $carrier = $seconds;
    foreach&#40;$time_magnitudes as $key=>$div&#41; &#123;
        $value = &#40;int&#41;&#40;$carrier / $div&#41;;
        $carrier %= $div;
        if &#40;$value>0&#41; &#123;
            if &#40;strlen&#40;$result&#41;>0&#41; &#123;
                $result .= ' ';
            &#125;
            $result .= $value . ' ' . $key;
            if &#40;$value>1&#41; &#123;
                $result .= 's';
            &#125;
        &#125;
    &#125;
    return $result;
&#125;
?>
Στη function περνάμε τα δευτερόλεπτα που θέλουμε να μετατρέψουμε σε φιλικό προς το χρήστη χρόνο. Για το "πόσο έχει περάσει" αφέρεσε το start time από το current time όπως σου έδειξε ο MaZz.

Αν πρόκειτε να μετράς μεγάλους χρόνους (το uptime της εφαρμογής σου πχ) μπορείς να προσθέσεις στοιχεία για week, month κτλ.

client κώδικας:

Κώδικας: Επιλογή όλων

getHumanFriendlyTime&#40;1&#41;;          // 1 second
getHumanFriendlyTime&#40;10&#41;;         // 10 seconds
getHumanFriendlyTime&#40;100&#41;;        // 1 minute 40 seconds
getHumanFriendlyTime&#40;1000&#41;;       // 16 minutes 40 seconds
getHumanFriendlyTime&#40;10000&#41;;      // 2 hours 46 minutes 40 seconds
getHumanFriendlyTime&#40;100000&#41;;     // 1 day 3 hours 46 minutes 40 seconds
getHumanFriendlyTime&#40;1000000&#41;;    // 11 days 13 hours 46 minutes 40 seconds
getHumanFriendlyTime&#40;10000000&#41;;   // 115 days 17 hours 46 minutes 40 seconds

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από MaZz » 04 Μάιος 2008 21:01

Το βασικό πρόβλημα με τους μήνες είναι ότι δε δίνουν ακριβή αποτελέσματα, γιατί ο ένας μήνας μπορεί να έχει 30 ημέρες ενώ ο άλλος 31, και ως εκ τούτου χρησιμοποιούμε σαν περίοδο μήνα (σε δευτερόλεπτα) κάποιο μέσο όρο π.χ. 60 * 60 * 24 * 30.5
Στο google βγάζει τόσα δευτερόλεπτα: http://www.google.gr/search?hl=el&clien ... E%B7&meta=

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cherouvim » 04 Μάιος 2008 21:03

Ναι. Ανάλογα και που θες να το χρησιμοποιήσεις.

Στο uptime ενός server προτιμώ να δω: 244 days 5 hours 2 minutes
Στο πότε ήρθε ένα email προτιμώ το: 2 months 4 days ago

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από MaZz » 04 Μάιος 2008 21:07

Σχετικά με το timestamp, εχω διαβάσει ότι έχει ημερομηνία λήξης. Γνωρίζεις κάτι γι' αυτό?

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cherouvim » 04 Μάιος 2008 21:25

Τι εννοείς;

Η time() επιστρέφει το unit timestamp σε seconds σε int.
Unix Epoch (January 1 1970 00:00:00 GMT).
Κάποτε θα κάνει overflow αυτό το νούμερο, αλλά μάλλον δεν μας νοιάζει αυτό ;)

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από Rapid-eraser » 05 Μάιος 2008 08:43

me tous 64bitous exei li8ei to 8ema afto :P
doksa to 8eo oi int times afksi8ikave :)
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cherouvim » 05 Μάιος 2008 08:55

Αρνητικό το βρίσκω που το int στην php είναι platform-dependent.
Εντελώς παιδικό... απορώ ποιος το σκέφτηκε.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από Rapid-eraser » 05 Μάιος 2008 10:11

Γι αυτό το λόγο και πλέον είναι διαθέσιμα και τα calender functions που είναι αυτόνομα και δεν είναι platform-dependent
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cpulse » 05 Μάιος 2008 10:40

Rapid-eraser έγραψε:doksa to 8eo oi int times afksi8ikave :)
Τι;;; Κι αυτά αυξηθήκανε; Α ρε αλογοσκούφη τι μας έχεις κάνει..
cherouvim έγραψε:Αρνητικό το βρίσκω που το int στην php είναι platform-dependent.
Εντελώς παιδικό... απορώ ποιος το σκέφτηκε.
Μάλλον αυτό θα ξεκινάει από τα int definitions σε low level επίπεδο. Λογικά για να αλλάξουν κάτι τέτοιο θα πρέπει να κάνουν πολύ ζόρικο refactoring.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Εύρεση πόσες μέρες, ώρες και λεπτά έχουν περάσει....

Δημοσίευση από cherouvim » 05 Μάιος 2008 11:04

cpulse έγραψε:Μάλλον αυτό θα ξεκινάει από τα int definitions σε low level επίπεδο. Λογικά για να αλλάξουν κάτι τέτοιο θα πρέπει να κάνουν πολύ ζόρικο refactoring.
Σημασία έχει οτι έτσι μπορεί να σπάνε κάποιες εφαρμογές.

Βέβαια η PHP δεν έχει τη φιλοσοφία του σωστού API design, backwards compatibility κτλ οπότε ίσως είναι μικρό το κακό.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες