webForumDet fria alternativet

Script som räknar dagar _från_ ett datum

20 svar · 828 visningar · startad av silfver

silfverMedlem sedan apr. 200312 679 inlägg
#1

Jag vet ju hur man gör en nedräknare i PHP, men hur gör jag om jag vill göra en som fungerar tvärtom? Alltså, jag har ett datum, från det vill jag att den ska räkna ut dagar, timmar gärna minuter och sekunder också om det är möjligt.

mvh

silfverMedlem sedan apr. 200312 679 inlägg
#2

Ingen som vet vad jag snackar om? :P

MatteMedlem sedan aug. 20002 975 inlägg
#3

Att göra ett skript som räknar ut skillnaden från ett datum, respektive till ett datum måste i princip vara samma sak, så du borde kunna återanvända din kod som du redan har, med en smärre modifiering.

Sen att visa sekunder och minuter.
PHP har redan gjort sitt när sidan kommer till webbläsaren, så vill du att något ska hända med sekunderna på skärmen, så blir det till att använda javascript.

silfverMedlem sedan apr. 200312 679 inlägg
#4

Allt jag har är denna:

<?
$day = 1; // Day of the countdown
$month = 8; // Month of the countdown
$year = 2003; // Year of the countdown
print ("Det är " . (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400) . " dagar kvar.");
?>

Sekunder är inte så viktigt. Inte minuter heller.

MatteMedlem sedan aug. 20002 975 inlägg
#5
<?php

$day = 22; // Day of the countdown 
$month = 7; // Month of the countdown 
$year = 2003; // Year of the countdown 
print ("Det har gått " . floor((time() - mktime (0,0,0,$month,$day,$year))/86400) . " dagar."); 

?>
silfverMedlem sedan apr. 200312 679 inlägg
#6

Ja den där funkar bra.

Kan man få den att skriva ut veckor istället för dagar, eller månader. Så det blir något i stil med:

2 månader och 3 dagar?

MatteMedlem sedan aug. 20002 975 inlägg
#7

För länge sedan hjälpte jag någon med ett födelsadagsskript, som gjorde ungefär detta och en hel del till.
Rensa bort alla rader som sätter variabler som har 'left_' i indexnamnet, och eventuellt också de variabler som sätter 'year'.
Sen kan du ju byta namn på variabler om du så önskar.

<?php

function calc_age($month,$day,$year) { 
// $month och $day UTAN inledande nollor 
// $year med fyra siffror 

	$age['year'] = date("Y") - $year; 

	$nToday = date("z");
	$nMonth = date("n");
	$nDay = date("j");
	
	$nBirthday = date("z", mktime(1,0,1,$month,$day,date("Y"))); 

	if ($nToday < $nBirthday){
	
		$age['year']--;
		$age['month'] = 12 - $month + $nMonth;
		$age['left_month'] = $month - $nMonth;
		
		if ($day > $nDay){
			$age['month']--;
			$age['days'] = date("z", mktime(1,0,1,$month,$nDay,date("Y"))) - date("z", mktime(1,0,1,$month-1,$day,date("Y")));
			$age['left_days'] = $day - $nDay;
		} else {
			$age['days'] = $nDay - $day;	
			$age['left_month']--;
			$age['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) - date("z", mktime(1,0,1,$month-1,$nDay,date("Y")));			
		}
	
	} elseif ($nToday > $nBirthday){
		
		$age['month'] = $nMonth - $month;
		$age['left_month'] = 12 - $nMonth + $month;
		
		if ($day > $nDay){
			$age['month']--;
			$age['days'] = date("z", mktime(1,0,1,$nMonth,$nDay,date("Y"))) - date("z", mktime(1,0,1,$nMonth-1,$day,date("Y")));
			$age['left_days'] = $day - $nDay;
		} else {
			$age['days'] = $nDay - $day;	
			$age['left_month']--;
			if ($month > 1){
				$age['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) - date("z", mktime(1,0,1,$month-1,$nDay,date("Y")));
			} else {
			  $age['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) + 1 + date("z", mktime(1,0,1,12,31,date("Y"))) - date("z", mktime(1,0,1,12,$nDay,date("Y")));
			}
		}
		
	} else {
		$age['days'] = 0;
		$age['month'] = 0;
		$age['left_month'] = 12;
		$age['left_days'] = 0;
	}

	return $age; 

} // Slut funktion

$age = calc_age(12, 5, 1982);

echo "Du är ".$age['year']." år, ".$age['month']." månader och ".$age['days']." dagar<br>";
echo "Du har ".$age['left_month']." månader och ".$age['left_days']." dagar kvar till nästa födelsedag";

?>
silfverMedlem sedan apr. 200312 679 inlägg
#8

Den där blir så väldigt avancerad. Om jag skriver 20-5-2003, så tror den att jag inte är född ännu...

MatteMedlem sedan aug. 20002 975 inlägg
#9

5-20-2003 hade kanske gått bättre :)

Förstod inte att du ville ha tid som har gått i samma format också.

Då gör vi en lätt modifiering av samma skript så får du bägge delarna.

<?php

function check_date($date) { 
// $date i formatet YYYY-MM-DD

  $year = substr($date, 0, 4);
  $month = (INT)substr($date, 5, 2);
  $day = (INT)substr($date, 8, 2); 

	$check['year'] = date("Y") - $year;
  $check['left_year'] = $year - date("Y"); 

	$nToday = date("z");
	$nMonth = date("n");
	$nDay = date("j");
	
	$nDate = date("z", mktime(1,0,1,$month,$day,date("Y"))); 

	if ($nToday < $nDate){
	
 		$check['year']--;
		$check['month'] = 12 - $month + $nMonth;
		$check['left_month'] = $month - $nMonth;
		
		if ($day > $nDay){
			$check['month']--;
			$check['days'] = date("z", mktime(1,0,1,$month,$nDay,date("Y"))) - date("z", mktime(1,0,1,$month-1,$day,date("Y")));
			$check['left_days'] = $day - $nDay;
		} else {
			$check['days'] = $nDay - $day;	
			$check['left_month']--;
			$check['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) - date("z", mktime(1,0,1,$month-1,$nDay,date("Y")));			
		}
	
	} elseif ($nToday > $nDate) {
		
 		$check['month'] = $nMonth - $month;
		$check['left_month'] = 12 - $nMonth + $month;
    $check['left_year']--;
		
		if ($day > $nDay){
			$check['month']--;
			$check['days'] = date("z", mktime(1,0,1,$nMonth,$nDay,date("Y"))) - date("z", mktime(1,0,1,$nMonth-1,$day,date("Y")));
			$check['left_days'] = $day - $nDay;
		} else {
			$check['days'] = $nDay - $day;	
			$check['left_month']--;
			if ($month > 1) {
				$check['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) - date("z", mktime(1,0,1,$month-1,$nDay,date("Y")));
			} else {
			  $check['left_days'] = date("z", mktime(1,0,1,$month,$day,date("Y"))) + 1 + date("z", mktime(1,0,1,12,31,date("Y"))) - date("z", mktime(1,0,1,12,$nDay,date("Y")));
			}
		}
		
	} else {
		$check['days'] = 0;
		$check['month'] = 0;
		$check['left_month'] = 0;
		$check['left_days'] = 0;
	}

//	return $check;
  if ($date > date("Y-m-d")) {
     return "Det är kvar {$check['left_year']} år, {$check['left_month']} månader och {$check['left_days']} dagar";
  } else if ($date < date("Y-m-d")) {
     return "Det har gått {$check['year']} år, {$check['month']} månader och {$check['days']} dagar";
  } else {
     return "Idag är den stora dagen.";
  }

} // Slut funktion

echo check_date("2003-05-20");

?>

Hade säkert gått att göra mycket smidigare. Nu finns här stöd för att kunna ta med datum före 1970,
men då hade jag behövt lägga ner lite arbete på det.
Du får själv rensa bort om du vill.

silfverMedlem sedan apr. 200312 679 inlägg
#10

Tack ska du ha, nu funkar det bättre.
Jag är inte så haj på PHP så jag jag vågar inte ta bort onödig kod, men tack ska du ha för hjälpen! :)

QimenMedlem sedan juni 20015 009 inlägg
#11

Nu när vi är innne på en sådan tråd kan jag passa på att fråga en liknande fråga.

<? 
$day = 1;     // Day of the countdown 
$month = 8;  // Month of the countdown 
$year = 2003;       // Year of the countdown 
print ("Det är " . (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400) . " dagar kvar."); 
?>

Koden ovan räknar ju ut hur många dagar det är kvar till ett datum. Skulle man kunna ändra om det litet så att den bara visar timmar och minuter i nedräkning? Har ett datumfält i databasen 2000-01-01 10:00:00 så ex. det är 3 timmar och 15 minuter kvar. :)

silfverMedlem sedan apr. 200312 679 inlägg
#12

$duration($calc($ctime(January 1 2000 10:00) - $ctime))

Hm. Något med dessa kanske?

QimenMedlem sedan juni 20015 009 inlägg
#13

Nja det datumet kan ändras och står i formatet 2001-01-0-1 00:00:00 menade jag.

GuldstrandMedlem sedan juli 20041 271 inlägg
#14

Matte skrev:

<?php

$day = 22; // Day of the countdown 
$month = 7; // Month of the countdown 
$year = 2003; // Year of the countdown 
print ("Det har gått " . floor((time() - mktime (0,0,0,$month,$day,$year))/86400) . " dagar."); 

?>

Jag använder denna kod på min hemsida, men jag skulle gärna vilja visa timmar också.

Hur gör jag det..? :r

MatteMedlem sedan aug. 20002 975 inlägg
#15

Ett exempel:

$datum = '2003-07-22'; // Underförstått kl 00:00:00. Lägg på tid om du önskar

// Antalet sekunder sedan $datum
$time = time() - strtotime($datum);

// Beräkna dagar, timmar m.m.

$days = floor($time / 86400);

$rest = $time % 86400;
$hours = floor($rest / 3600);

$rest = $rest % 3600;
$minutes = floor($rest / 60);

$seconds = $rest % 60;

// Skriv ut resultatet
echo "
  Det har gått $days dagar, $hours timmar, $minutes minuter 
  och $seconds sekunder sedan $datum.
";
GuldstrandMedlem sedan juli 20041 271 inlägg
#16

Matte skrev:

Ett exempel:

$datum = '2003-07-22'; // Underförstått kl 00:00:00. Lägg på tid om du önskar

// Antalet sekunder sedan $datum
$time = time() - strtotime($datum);


// Beräkna dagar, timmar m.m.

$days = floor($time / 86400);

$rest = $time % 86400;
$hours = floor($rest / 3600);

$rest = $rest % 3600;
$minutes = floor($rest / 60);

$seconds = $rest % 60;

// Skriv ut resultatet
echo "
  Det har gått $days dagar, $hours timmar, $minutes minuter 
  och $seconds sekunder sedan $datum.
";

Tack!

Fungerade jättebra... :birp

GuldstrandMedlem sedan juli 20041 271 inlägg
#17

Tydligen så finns det ett litet fel i detta script... :(

Jag valde att göra en nedräkning på 1 vecka, och nu när det är 0 dagar 2 timmar och 19 minuter kvar så börjar minuterna gå uppåt igen istället för att fortsätta neråt. (Svårt att förklara..)

Någon som vet hur jag kan fixa detta?

MatteMedlem sedan aug. 20002 975 inlägg
#18

Låter mer som om tiden skulle vara fel på servern.

Hur har du tillämpat skriptet ?
Visa kod.

GuldstrandMedlem sedan juli 20041 271 inlägg
#19

Matte skrev:

Låter mer som om tiden skulle vara fel på servern.

Hur har du tillämpat skriptet ?
Visa kod.

Detta använde jag...

$datum = '2005-06-06'; // Underförstått kl 00:00:00. Lägg på tid om du önskar
// Antalet sekunder sedan $datum
$time = time() - strtotime($datum);
// Beräkna dagar, timmar m.m.
$days = floor($time / 86400);
$rest = $time % 86400;
$hours = floor($rest / 3600);
$rest = $rest % 3600;
$minutes = floor($rest / 60);
$seconds = $rest % 60;
// Skriv ut resultatet
echo "
<br><br>'Det är <b>$days</b> dagar, <b>$hours</b> timmar, <b>$minutes</b> minuter kvar innan tävlingen är avslutad.'<br>Vem blir den lycklige vinnaren?
";

// NEDRÄKNING - END
MatteMedlem sedan aug. 20002 975 inlägg
#20

I och med att du vill ha tid som är kvar får du vända på steken:

$time = strtotime($datum) - time();
133 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)