PHP: datumuträkning

Tråden skapades och har fått 17 svar. Det senaste inlägget skrevs .
1

Hur kan man enklast räkna dagarna mellan två datum i PHP?

2006-10-20 - 2006-10-17 ?
Vill få fram antalet dagar mellan dessa två ovanstående datum. Försökte med alla möjliga metoder men får inte fram rätt värde.

Här var min idé:

<?php
function numberofDays($newerDate,$elderDate) {
$deltaDate = strtotime($newerDate) - strtotime($elderDate);
$result = xxx($deltaDate);
return $result;
}

$currentDate = date("Y-m-d");
$testDate = "2006-10-17";
print numberofDays($currentDate,$testDate);
?>

Jag kanske är ute och cyklar nu?

  • Medlem
  • 2006-10-20 12:05

om du delar deltaDate med (60*60*24) (3600 sekunder och 24 sådana på en dag)
så kanske det blir rätt?

Ursprungligen av pawh:

om du delar deltaDate med (60*60*24) (3600 sekunder och 24 sådana på en dag)
så kanske det blir rätt?

Tusen tack, pawh!
Du löste mitt problem. Jag tänkte inte på den simpla (60*60*24)!!

  • Medlem
  • Malmö
  • 2006-10-20 14:46
Ursprungligen av The Real Viking:

Tusen tack, pawh!
Du löste mitt problem. Jag tänkte inte på den simpla (60*60*24)!!

Tänk på att detta inte täcker in justeringar för sommartid/vintertid. (Kommer inte ihåg vilken av dem, men en kommer att bli felaktig).

Ursprungligen av Timber:

Tänk på att detta inte täcker in justeringar för sommartid/vintertid. (Kommer inte ihåg vilken av dem, men en kommer att bli felaktig).

Det borde räcka med avrundning för att justera för detta, va?

function daysBetween($firstDate, $secondDate) {
	return round(abs(strtotime($firstDate) - strtotime($secondDate)) / (60*60*24));
}
Ursprungligen av Adrian B:

Det borde räcka med avrundning för att justera för detta, va?

function daysBetween($firstDate, $secondDate) {
	return round(abs(strtotime($firstDate) - strtotime($secondDate)) / (60*60*24));
}

Tack Adrian,
har lagt till round och abs och ändrade lite på funktionen. Kodsnutten fungerar riktigt bra!

  • Medlem
  • 2006-10-20 15:54
Ursprungligen av The Real Viking:

Tusen tack, pawh!
Du löste mitt problem. Jag tänkte inte på den simpla (60*60*24)!!

Ingen fara, det är väl därför man hänger på forum

  • Medlem
  • 2006-10-20 12:09

iofs borde du ta absolutbeloppet på $deltaDate, så kan du ju mata in i vilken ordning du vill det är ju lika långt mellan ett datum som ligger framför som ett som ligger bakom

Går att göra en snygg enradare av det

function daysBetween($firstDate, $secondDate) {
	return abs(strtotime($firstDate) - strtotime($secondDate)) / (60*60*24);
}
  • Medlem
  • Mölndal
  • 2006-10-20 17:34

Jag förstår inte riktigt hur sommar- och vintertid kom in i resonemanget. Kan nån förklara hur det skulle påverka?

  • Medlem
  • Malmö
  • 2006-10-20 18:46
Ursprungligen av memark:

Jag förstår inte riktigt hur sommar- och vintertid kom in i resonemanget. Kan nån förklara hur det skulle påverka?

Om du exempelvis vill ha reda på antalet dagar mellan 1:a mars till 31:a mars, kommer du troligen få ett resultat som säger något i stil med 30.95833333. Förväntar man sig ett heltal är det lätt att bara kapa av decimalerna, vilket ger 30 dagar... alltså blir räkningen fel på en dag. Nu antar jag att iofs att funktionen ska vara generell och kunna återanvändas och appliceras på alla typer av datumberäkningar.

  • Medlem
  • Mölndal
  • 2006-10-20 20:18

Ah, du har rätt. Hade ingen aning om att strtotime() "bytte" tidszon så där. Styrs det av OSet, eller av php-installationen?

Vill man slippa anvrunda kan man istället explicit ange tidszon (vilken kvittar) i båda fallen, t ex

strtotime('2006-06-01 GMT')-strtotime('2006-01-01 GMT')
  • Medlem
  • 2006-10-20 21:55
Ursprungligen av memark:

Ah, du har rätt. Hade ingen aning om att strtotime() "bytte" tidszon så där. Styrs det av OSet, eller av php-installationen?

Vill man slippa anvrunda kan man istället explicit ange tidszon (vilken kvittar) i båda fallen, t ex

Nja, den byter väl inte tidszon utan snarare mellan sommar/vintertid inom tidszonen.

Av någon anledning brukar jag alltid få in dylika datum-beräkningar som en bonus i någon SQL-sats någonstans...

  • Medlem
  • 2006-10-20 23:07

GMT har inte vinter/sommartid, det är ju normaltidszonen.. tycker man borde avskaffa sommar/vintertid bara drygt att ha en sommartid egentligen.

Ja, det har inte med tidzonen att göra utan bara övergången mellan sommar- och vintertid. Om man tar min första kodsnott ovan (den utan round) och tar dagens datum och en månad framåt (dvs till när det är vintertid) får man inte ett heltal utan ett decimaltal ungefär som Timber visade.

En av dagarna från nu och en månad framåt kommer nämligen inte att ha 24 timmar och därmed går inte ekvationen jämnt ut.

Det finns ett datumformat som kallas julian day count, som är mycket lättare att räkna med. Man slipper alla skottdagar, olika långa månader osv. Julian Day är ett heltal, det antal dagar som passerat sedan första januari år 4713 f.kr.

Så länge du inte har olika tidszoner att räkna med, tycker jag det är lättast att ha alla datum som jd internt i programmet, och bara konvertera till gregoriansk kalender när man skall skriva ut ett datum.

Ett exempel (2006-10-20 - 2006-10-17):

<?php
echo gregoriantojd(10,20,2006)-gregoriantojd(10,17,2006);
?>

kalenderfunktioner: http://www.w3schools.com/php/php_ref_calendar.asp

Ursprungligen av Törstig:

Det finns ett datumformat som kallas julian day count, som är mycket lättare att räkna med.

Ah, intressant, det kände jag inte till.

Å, ett tillägg: skall du loopa över ett antal dagar, försök inte ens utan att använda jd!

1
Bevaka tråden