---
title: "Problem med datumfunktion"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/175964-problem-med-datumfunktion"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Asa"
published: "2008-12-21T03:20:42.000Z"
updated: "2008-12-22T09:04:06.000Z"
replies: 11
views: 616
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/175964-problem-med-datumfunktion"
---

# Problem med datumfunktion

## #1 — Asa, 2008-12-21T03:20Z

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 . ')';
			}
		}
	}
}
?>
```

Permalänk: https://www.webforum.nu/p/175964

## #2 — pulse, 2008-12-21T16:23Z

```
<?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;
}
```

Permalänk: https://www.webforum.nu/p/2160290

## #3 — Asa, 2008-12-21T17:00Z

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..

Permalänk: https://www.webforum.nu/p/2160296

## #4 — pulse, 2008-12-21T17:34Z

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 :)

Permalänk: https://www.webforum.nu/p/2160300

## #5 — überfuzz, 2008-12-21T18:16Z

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:**
>
> ```php
> // ---------- 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;
> }
> ```

Permalänk: https://www.webforum.nu/p/2160305

## #6 — pulse, 2008-12-21T18:25Z

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.

Permalänk: https://www.webforum.nu/p/2160307

## #7 — überfuzz, 2008-12-21T18:51Z

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

Permalänk: https://www.webforum.nu/p/2160316

## #8 — Asa, 2008-12-21T19:35Z

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

```php
	$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 . ')';
			}
		}
	}
```

Permalänk: https://www.webforum.nu/p/2160323

## #9 — überfuzz, 2008-12-21T19:52Z

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

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

Permalänk: https://www.webforum.nu/p/2160325

## #10 — Asa, 2008-12-22T00:18Z

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

Permalänk: https://www.webforum.nu/p/2160352

## #11 — pulse, 2008-12-22T02:46Z

```
<?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;
}
```

Permalänk: https://www.webforum.nu/p/2160359

## #12 — Asa, 2008-12-22T09:04Z

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

Permalänk: https://www.webforum.nu/p/2160366

---

Tråden på webben: https://www.webforum.nu/amne/php/175964-problem-med-datumfunktion
