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
20 svar · 828 visningar · startad av silfver
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
Ingen som vet vad jag snackar om? :P
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.
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.
<?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.");
?>
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?
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";
?>
Den där blir så väldigt avancerad. Om jag skriver 20-5-2003, så tror den att jag inte är född ännu...
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.
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! :)
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. :)
Nja det datumet kan ändras och står i formatet 2001-01-0-1 00:00:00 menade jag.
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
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.
";
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
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?
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
I och med att du vill ha tid som är kvar får du vända på steken:
$time = strtotime($datum) - time();