AsaMedlem sedan dec. 20011 934 inlägg
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 . ')';
}
}
}
}
?>
pulseMedlem sedan nov. 200384 inlägg
<?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;
}
AsaMedlem sedan dec. 20011 934 inlägg
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..
pulseMedlem sedan nov. 200384 inlägg
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 :)
überfuzzMedlem sedan apr. 2006434 inlägg
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;
}
pulseMedlem sedan nov. 200384 inlägg
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.
überfuzzMedlem sedan apr. 2006434 inlägg
Okej, men inte när du bjussar tjejer på din kod. :q
AsaMedlem sedan dec. 20011 934 inlägg
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 . ')';
}
}
}
überfuzzMedlem sedan apr. 2006434 inlägg
Kan du inte skriva några rader om hur du vill visa datumen?
Ex: 16dagar sedan - 2008-12-04 21:19:59
AsaMedlem sedan dec. 20011 934 inlägg
Står i mitt förra inlägg i den IF-satsen. Alla kommentarer där..
pulseMedlem sedan nov. 200384 inlägg
<?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;
}
AsaMedlem sedan dec. 20011 934 inlägg
Nu är det nästan som det ska vara. Tack. Jag kan nog fixa resten nu :)