webForumDet fria alternativet

Problem med datumfunktion

PHP

11 svar · 607 visningar · startad av Asa

Medlem sedan dec. 20011 860 inlägg
Frågan#1

Har en funktion som visar hur länge sen det var ett datum var som visas i olika format. Ex: 4 sek sedan, 1 min och 4 sek sen och uppåt.

Har nu problem att den räknar konstigt med sekunderna. Den räknar från 1 upp till 15 och sen visas sekunderna från -45 och räknar neråt. På mitt webbhotell räknar den ända upp till 45 och börjar sen räkna -15 och ner till 0.

Någon som kan kolla varför detta görs. Sätt datumet så det skiljer ca 5 minuter från datumet som är just nu.

<?php
$date = "2008-12-21 04:03:44"; 
echo Datum($date);
       
function Datum($data_ref){
	// Get the current date
	$current_date = date('Y-m-d H:i:s');

	// Extract from $current_date
	$current_year = substr($current_date,0,4);
	$current_month = substr($current_date,5,2);
	$current_day = substr($current_date,8,2);

	// Extract from $data_ref
	$ref_year = substr($data_ref,0,4);
	$ref_month = substr($data_ref,5,2);
	$ref_day = substr($data_ref,8,2);

	// create a string yyyymmdd 20071021 and yyyy-mm-dd
	$tempMaxDate = $current_year . $current_month . $current_day;
	$tempDataRef = $ref_year . $ref_month . $ref_day;
	$tempDifference = $tempMaxDate-$tempDataRef;
	$tempMaxDate2 = $current_year .'-'. $current_month .'-'. $current_day;
	$tempDataRef2 = $ref_year .'-'. $ref_month .'-'. $ref_day;

	// Extract $current_date H:m:ss
	$current_hour = substr($current_date,11,2);
	$current_min = substr($current_date,14,2);
	$current_seconds = substr($current_date,17,2);

	// Extract $data_ref Date H:m:ss
	$ref_hour = substr($data_ref,11,2);
	$ref_min = substr($data_ref,14,2);
	$ref_seconds = substr($data_ref,17,2);
	$ref_tid = substr($data_ref,11,5);

	$hDf = $current_hour-$ref_hour;
	$mDf = $current_min-$ref_min;
	$sDf = $current_seconds-$ref_seconds;

	// If the difference is GT 15 days show the date
	if($tempDifference >= 15){
		echo $tempDataRef2 .' (' . $ref_tid . ')';
	} else {
		// Show time difference ex: 2 min 54 sec ago.
		$dDf=$tempDifference;
		if($dDf<1){
			if($hDf>0){
				if($mDf<0){
					$mDf = 60 + $mDf;
					$hDf = $hDf - 1;
					echo $mDf . ' min sedan';
				} else {
					echo $hDf. ' h ' . $mDf . ' min sedan';
				}
			} else {
				if($mDf>0){
					echo $mDf . ' min ' . $sDf . ' sek sedan';
				} else {
					echo $sDf . ' sek sedan';
				}
			}
		} else {
			if($dDf == 1){
				echo ' Igår (' . $ref_tid . ')';
			}else{
				echo $dDf . ' dagar sen (' . $ref_tid . ')';
			}
		}
	}
}
?>
Medlem sedan nov. 200373 inlägg
#2
<?php
echo "<pre>";
echo diff("2008-12-21 15:31:41") . PHP_EOL;
//tester
echo diff("2007-12-21 15:31:41", "2008-12-21 15:49:44") . PHP_EOL;
echo diff("2008-12-10 15:31:41", "2008-12-21 11:11:11") . PHP_EOL;
echo diff("2008-12-21 15:31:41", "2008-12-21 15:31:42") . PHP_EOL;
echo diff("2008-12-21 15:31:10", "2008-12-21 15:31:59") . PHP_EOL;

function diff($time, $now = null){
	$seconds = timediff($time, $now);	
	$fifteendays = 86400 * 15;
	return $seconds >= $fifteendays ? $time : format($seconds);
}

function format($seconds){
	$durations = durations($seconds);
	$result = "";
	foreach($durations as $period => $value){
		$result .= sprintf("%s %s ", $value, $period);
	}
	return trim($result) . " ago";
}

function durations($seconds){
	$periods = array(
        'years' => 31556926,
        'months' => 2629743,
        'weeks' => 604800,
        'days' => 86400,
        'hours' => 3600,
        'minutes' => 60,
        'seconds' => 1
    );
    $durations = array();
    foreach ($periods as $period => $seconds_in_period) {
        if ($seconds >= $seconds_in_period) {
            $durations[$period] = floor($seconds / $seconds_in_period);
            $seconds -= $durations[$period] * $seconds_in_period;
        }
    }
    return $durations;
}

function timediff($time, $timenow = null){
	$timenow = is_null($timenow) ? time() : strtotime($timenow);
	$time = strtotime($time);
	return $timenow - $time;
}
Medlem sedan dec. 20011 860 inlägg
#3

Bra kod.. Men hur gör jag som i min kod att den kollar de olika värdena och skriver ut det jag vill.. Nu skriver den ut så himla mycket i ditt exempel..

Medlem sedan nov. 200373 inlägg
#4

Inte riktigt säker på vad du menar där. Om du inte vill ha med år, månader, veckor så kan du ändra $periods till

$periods = array(
        'days' => 86400,
        'hours' => 3600,
        'minutes' => 60,
        'seconds' => 1
);

sen kan du köra:
var_dump($durations);
...i funktionen format så ser du alla värden. Det är sen upp till dig att använda dem, det här var bara ett exempel :)

Medlem sedan apr. 2006409 inlägg
#5

Kommenterar du aldrig dina funktioner? Kan vara skönt om man inte använt en funktion på länge. Exempel, jag gissar vad den gör. Orkar inte testa, du förstår nog mitt tips ändå. :bire

pulse skrev:

// ---------- duration(argument) ------------------
// duration() takes an argument with seconds and converts it to time given in an array. The keys are: years, month, weeks, days, hours, minutes and seconds.


// ------------ example of usage ------------------
// $sec = 1200;
// $time_array = duration($sec);



function durations($seconds)
{
	$periods = array(
		'years' => 31556926,
		'months' => 2629743,
		'weeks' => 604800,
		'days' => 86400,
		'hours' => 3600,
		'minutes' => 60,
		'seconds' => 1
		);
	$durations = array();
	foreach ($periods as $period => $seconds_in_period)
	{
		if ($seconds >= $seconds_in_period)
		{
			$durations[$period] = floor($seconds / $seconds_in_period);
			$seconds -= $durations[$period] * $seconds_in_period;
		}
	}
	return $durations;
}
Medlem sedan nov. 200373 inlägg
#6

Jo jag kommenterar i vanliga fall (i produktionskod). Jag följer dessutom standarden som finns:
http://www.phpdoc.org/

så att man kan generera dokumentation och det funkar med editorn.

Medlem sedan apr. 2006409 inlägg
#7

Okej, men inte när du bjussar tjejer på din kod. :q

Medlem sedan dec. 20011 860 inlägg
#8

Så här menar jag då om du kollar denna ifsatsen:

	$hDf = $current_hour-$ref_hour;
	$mDf = $current_min-$ref_min;
	$sDf = $current_seconds-$ref_seconds;

	if($tempDifference >= 15){ // Om postade datumet är mer än 15 dagar sen
                // Visar datumet som YYY-MM-DD (HH:MM)
		echo $tempDataRef2 .' (' . $ref_tid . ')';
	} else {
		// Show time difference ex: 2 min 54 sec ago.
		$dDf=$tempDifference;
		if($dDf<1){
			if($hDf>0){
				if($mDf<0){
					$mDf = 60 + $mDf;
					$hDf = $hDf - 1;
                                        // Visar som X min sedan
					echo $mDf . ' min sedan';
				} else {
                                        // Visar som X h Y min sedan
					echo $hDf. ' h ' . $mDf . ' min sedan';
				}
			} else {
				if($mDf>0){
                                        // Visar som X min Y sek sedan
					echo $mDf . ' min ' . $sDf . ' sek sedan';
				} else {
                                        // Visar som X sek sedan
					echo $sDf . ' sek sedan';
				}
			}
		} else {
			if($dDf == 1){
                                // Visar som Igår (HH:MM)
				echo ' Igår (' . $ref_tid . ')';
			}else{
                                // Visar som X dagar sen (HH:MM)
				echo $dDf . ' dagar sen (' . $ref_tid . ')';
			}
		}
	}
Medlem sedan apr. 2006409 inlägg
#9

Kan du inte skriva några rader om hur du vill visa datumen?

Ex: 16dagar sedan - 2008-12-04 21:19:59

Medlem sedan dec. 20011 860 inlägg
#10

Står i mitt förra inlägg i den IF-satsen. Alla kommentarer där..

Medlem sedan nov. 200373 inlägg
#11
<?php
echo "<pre>";
echo diff("2008-12-21 15:31:41") . PHP_EOL;
//tester
echo diff("2007-12-21 15:31:41", "2008-12-21 15:49:44") . PHP_EOL;
echo diff("2008-12-10 15:31:41", "2008-12-21 11:11:11") . PHP_EOL;
echo diff("2008-12-20 15:31:41", "2008-12-21 15:31:42") . PHP_EOL;
echo diff("2008-12-21 15:31:10", "2008-12-21 15:31:59") . PHP_EOL;
echo diff("2008-12-21 15:30:10", "2008-12-21 15:31:59") . PHP_EOL;

function diff($time, $now = null){
	$seconds = timediff($time, $now);
	$fifteendays = 86400 * 15;
	if($seconds > $fifteendays){
		return $time;
	}
	list($days, $hours, $minutes, $seconds) = array_values(durations($seconds));
	$timestamp = strtotime($time);
	if($days > 1){
		return sprintf("%s dagar sen (%s)", $days, date("H:i", $timestamp));
	}
	if($days == 1){		
		return sprintf("Igår (%s)", date("H:i", $timestamp));
	}		
	if($hours > 0){
		return sprintf("%s h %s min sedan", $hours, $minutes);
	}
	if($minutes > 0){
		return sprintf("%s min %s sek sedan", $minutes, $seconds);
	}
	return sprintf("%s sek sedan", $seconds);
}

function durations($seconds){
	$periods = array(
        'days' => 86400,
        'hours' => 3600,
        'minutes' => 60,
        'seconds' => 1
    );
    $durations = array("days" => 0, "hours" => 0, "minutes" => 0, "seconds" => 0);
    foreach ($periods as $period => $seconds_in_period) {
        if ($seconds >= $seconds_in_period) {
            $durations[$period] = floor($seconds / $seconds_in_period);
            $seconds -= $durations[$period] * $seconds_in_period;
        }
    }
    return $durations;
}

function timediff($time, $timenow = null){
	$timenow = is_null($timenow) ? time() : strtotime($timenow);
	$time = strtotime($time);
	return $timenow - $time;
}
Medlem sedan dec. 20011 860 inlägg
#12

Nu är det nästan som det ska vara. Tack. Jag kan nog fixa resten nu :)

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)