Ik wil graag de geboortedatum berekenen uit 2 strings.
$Datum="27-10-2014";
$Leeftijd= "3 jr";
//creer datum van string
$datumbinnenkomst=strtotime($Datum);
//leeftijd zonder jr
$string= "-".substr($Leeftijd, 0, -2)."year";
//Bereken geboortedatum
$bday = strtotime($string, $datumbinnenkomst);
echo date("d-m-Y", $bday);
Het werkt prima behalve als ik een getal gebruik met een komma erin, (dus als: $Leeftijd = "3.5 jr").
Kan iemand mij uitleggen waarom het dan niet werkt? Hoe kan ik dit oplossen?
Voor mijn idee (of iets dergelijks) hoef je denk ik de database niet aan te passen. Zie hier: https://3v4l.org/8lC97
Er komt dan zoiets uit:
- deze kat is 1 jaar(ingevoerde leeftijd is 1)
- deze kat is 1 jaar(ingevoerde leeftijd is 1.2)
- deze kat is iets ouder dan 1 jaar(ingevoerde leeftijd is 1.3)
- deze kat is bijna 3 jaar(ingevoerde leeftijd is 2.8)
- deze kat is ongeveer 13,5 jaar(ingevoerde leeftijd is 13.4)
- deze kat is ongeveer 13,5 jaar(ingevoerde leeftijd is 13.5)
- deze kat is ongeveer 13,5 jaar(ingevoerde leeftijd is 13.6)
- deze kat is bijna 14 jaar(ingevoerde leeftijd is 13.7)
- deze kat is ongeveer 14,5 jaar(ingevoerde leeftijd is 14.5)
- deze kat is 5 jaar(ingevoerde leeftijd is 5)
- deze kat is ongeveer 6,5 jaar(ingevoerde leeftijd is 6.6)
Dit zou iets werkbaars op kunnen leveren, maar ik denk dat daarmee het achterliggende probleem niet is opgelost.
Ik kreeg niet de indruk dat alle invoer tot op de punt (of komma) nauwkeurig en eenduidig is ingevuld. Daar zou naar mijn mening dan ook de reparatie moeten plaatsvinden: vervang al deze "gesproken data" door eenduidige datums, wellicht aangevuld met, zoals @Frank voorstelt, een tickbox die aangeeft of dit een schatting betreft of niet.
Dan ben je vervolgens vrij om dit, op grond van ondubbelzinnige en correct geformatteerde data, in een bepaald format weer te geven.
Daarnaast is alle data "relatief" (op <datum X> was <huisdier y> <z jaar> oud), wat natuurlijk ook niet fijn rekent. Vandaar mijn voorstel om al deze input een eenmalige overhaul te geven, in plaats van proberen m.b.v. potentieel problematische/onhandige data een leeftijd te berekenen :).
Je zou zelfs kunnen overwegen om een conversiescript hiervoor te schrijven. Zodat je de (eenmalige) omzetting zelf mogelijk kunt automatiseren. Sowieso kun je voor deze nieuwe data ook nieuwe velden aanmaken in je database, zodat bestaande data niet wordt beïnvloed / mogelijk wordt overschreven (eventueel kun je na afloop van zo'n conversie deze oude kolommen opschonen of gewoon laten staan). Rijst trouwens nog steeds de vraag: om hoeveel entries gaat het nou eigenlijk? :]
En vervolgens zou je dus eerst een soort van "dry run" kunnen doen zonder dat er daadwerkelijk data wordt ingevoerd/aangepast, maar waarmee je kijkt hoeveel e.e.a. automatisch omgezet kan worden. En hierbij kan het weer handig zijn dat dit script "verbose" is over wat er allemaal gebeurt, bijvoorbeeld dat deze melding geeft van in hoeveel gevallen deze niet middels een reguliere expressie (of wat dan ook) de "verbale datum" kon worden omgezet naar iets anders.
Zo kun je snel een indicatie krijgen van hoe groot de puinhoop is en mogelijk ook hoeveel werk het is om ofwel het conversiescript intelligenter te maken of het toch maar gewoon maar op de ouderwetse manier (handmatig) om te zetten.
EDIT: Mijn tip zou dus nog steeds zijn: fix je data, dat werkt uiteindelijk gewoon veel makkelijker. En als je dan zo'n conversiescript maakt, zorg dan dat je altijd naar de huidige / "werkende" situatie terug kunt ingeval er iets mis gaat. Ook in conversiescripts kunnen bugs zitten :p.
Misschien leuk om even te laten weten of je iets aan de opmerkingen van mijzelf en Frank hebt gehad. Dan weten we tenminste dat we het niet helemaal voor niks doen.
Het heeft best wat voeten in de aarde gehad omdat ik meer moest aanpassen dan ik in eerste instantie had voorzien. De invoer moest secuurder. Dat was vrij snel klaar maar dat betekende dat de uitvoer ook aangepast moest worden anders krijg je rare getallen (leeftijd 1,87 jaar ofzo). Ik moest nadenken over de berekeningen, is tenslotte lang geleden dat ik op school zat en als je het niet dagelijks doet zijn sommige dingen nog best een puzzel. Uiteindelijk heb ik een scriptje gemaakt dat weergeeft wat de huidige (geschatte) geboortedatum is, zodat ik de aktuele leeftijd kan schatten. Ik moest ook nadenken over afronden en beslissingen nemen zoals bijv. als een dier 7 weken en 5 dagen oud is, rond je dan af naar 8 weken of hou je het op 7 weken? Hetzelfde voor maanden en jaren. Dat vond ik ook best lastig want wanneer ga je afronden en doe je dat naar boven naar beneden of naar de helft?
Af en toe dacht ik: waar ben ik aan begonnen. Uiteindelijk ben ik nu aan het testen, of alles klopt en er geen rare dingen gebeuren. Hte kan zijn dat ik iets over het hoofd heb gezien, of dat en afronding me niet bevalt dus de klus is klaar maar nog niet af.
Bedankt voor de update! Leuk om te horen dat het in ieder geval de goede kant op gaat. Als je nog advies nodig hebt (mag ook inhoudelijk zijn ... bijv. wanneer rond je iets af) dan horen we het wel.