SweyMedlem sedan apr. 20003 971 inlägg Någon som lyckats göra om en dag när man är född till en ålder?
"1980-09-14" ska bli 19 idag och 20 imorgon.
har försökt att göra om strängen till en UNIX timestamp och sedan ta time() minus den. Men det gick inte alls.
Har någon förslag på hur man kan lösa detta?
------------------
- Swey
Bäst, vackrast, styggast...
emissionMedlem sedan dec. 19996 721 inlägg PHP suger lite när dt gäller datumhanteringen..
$dp=explode("-","1980-09-14");
$olddate=mktime(0,0,0,$dp[1],$dp[2],$dp[0]);
echo floor((time()-$olddate)/(3600*24*365,25));
borde skriva ut åldern. Ingen höjdare, jag vet...
$age=1969-date("Y",$olddate-time());
skulle kunna vara något också...
[Redigerat av emission den 13 sep 2000]
SweyMedlem sedan apr. 20003 971 inlägg Den sista fungerade inte. Den gav ett negativt tal som gjorde att date-funktionen inte ville fungera.
Men den andra lösningen fungerade utmärkt. Tack!
r Nej, förresten. Efter att ha testat koden med massor av olika fall så har jag sett att den inte fungerar om man är född innan 1969. Då blir åldern alltid 30. Visst är det bra för de som inte vill åldras efter 30 men inte för andra. :)
Varför detta?
------------------
- Swey
Bäst, vackrast, styggast...
[Redigerat av Swey den 14 sep 2000]
CssonMedlem sedan feb. 2000438 inlägg Misstänker att det kan ha att göra med att Unix utgår från 1970-01-01 i sin sekundräkning. Alla årtal dessförinnan skulle i så fall få sekund 0 som värde.
/Csson
Den här lösningen borde funka.
in => $birth
ut => $age
$birth = explode("-",$birth);
$today = explode("-",date("Y-m-d", time()));
$age = $today[0] - $birth[0];
if ($today[1] - $birth[1] < 0 || ($today[1] - $birth[1] == 0 && $today[2] - $birth[2] < 0)) $age--;
------------------
Murphy's Law of Thermodynamics:
Things get worse under pressure.
[Redigerat av sgtpepper den 14 sep 2000]
RobbanMedlem sedan dec. 19992 555 inlägg Japp, den sista borde funka. Man behöver dock inte använda explode() om man inte vill. Finns färdiga funktioner för att formatera datum. :)
t.ex.
function age($birthdate) {
$ts = getdate(strtotime($birthdate));
$te = getdate(time());
return $te['year'] - $ts['year'] - (($te['mon'] < $ts['mon'])
|| (($te['mon'] == $ts['mon']) && ($te['mday'] < $ts['mday'])));
}
------------------
Robban < robban@lipogram.com >
Jo, fast du kan inte använda funktioner som använder UNIX timestamp eftersom dessa börjar från den första januari 1970..
Så min lösning funkar fortfarande bäst :)
------------------
Murphy's Law of Thermodynamics:
Things get worse under pressure.
RobbanMedlem sedan dec. 19992 555 inlägg
Jo, fast du kan inte använda funktioner som använder UNIX timestamp eftersom dessa börjar från den första januari 1970.
Bara för att man får negativa "timestamps" för datum före 1970-01-01 så innebär det inte att man inte kan räkna med dem. Spelar ju ingen som helst roll om talet är negativt eller inte då det är differensen som är intressant. :)
Funktionen är testad med årtal före 1970, och jag har inte märkt av några problem.
------------------
Robban < robban@lipogram.com >
Sannerligen, det funkar :) :r
Jag testade tidigare idag på en W2000-burk, kanske var det som ställde till det?
------------------
Murphy's Law of Thermodynamics:
Things get worse under pressure.
RobbanMedlem sedan dec. 19992 555 inlägg Windowsversionen av PHP har ju dragits med vissa problem (fråga Swey :) ), så det är möjligt. Installera senaste versionen (4.0.2). Tror många buggar är fixade just när det gäller funktionen i Win32.
------------------
Robban < robban@lipogram.com >
SweyMedlem sedan apr. 20003 971 inlägg Robban, jag testade koden på min W2k-burk med senate versionen av PHP och det funkade inte på år före 1970.
Warning: Cannot perform date calculation in test.php on line 2
Det är möjligt att det fungerar i Unix-versionen men jag vill helst bygga skript som fungerar på båda plattformarna.
Så sgtpeppers kod är det enda som har fungerat hittils på min burk.
------------------
- Swey
Bäst, vackrast, styggast...
[Redigerat av Swey den 15 sep 2000]
RobbanMedlem sedan dec. 19992 555 inlägg Där ser man. :l
Skall man anmäla detta som en bug i Win32-versionen tro?
[redigerat]
En snabb koll tyder på att det är systemberoende. Verkar helt enkelt vara *nix som använder fler bitar för att representera datum. Ingen bug i PHP alltså.
Year may be a two or four digit value, with values between 0-69 mapping to 2000-2069 and 70-99 to 1970-1999 (on systems where time_t is a 32bit signed integer, as most common today, the valid range for year is somewhere between 1902 and 2037).
Hade jag ingen aaaning om. Hur kan ni använda ett så antikt system? ;)
[/redigerat]
------------------
Robban < robban@lipogram.com >
[Redigerat av Robban den 15 sep 2000]
SweyMedlem sedan apr. 20003 971 inlägg Vet inte om det är en bugg. Detta är koden jag provade och utdata.
<?
function age($birthdate) {
$ts = getdate(strtotime($birthdate));
$te = getdate(time()); return $te['year'] - $ts['year'] - (($te['mon'] < $ts['mon']) || (($te['mon'] == $ts['mon']) && ($te['mday'] < $ts['mday'])));
}
echo "1990-01-01: " . age("1990-01-01");
echo "1969-01-01: " . age("1969-01-01");
?>
Utdata:
1990-01-01: 10
Warning: Cannot perform date calculation in e:\inetpub\wwwroot\test.php on line 3
1969-01-01: 2000
r Windows använder 64-bitars tid och har inga problem med datum före 1970 så jag vet inte vad du menar.
------------------
- Swey
Bäst, vackrast, styggast...
[Redigerat av Swey den 15 sep 2000]
RobbanMedlem sedan dec. 19992 555 inlägg
Windows använder 64-bitars tid och har inga problem med datum före 1970 så jag vet inte vad du menar.
Citerade manualen (och jag inkluderade en ;) för säkerhets skull, så att ingen skulle ta åt sig). :)
Du vet alltså med säkerhet att time_t har 64 bitar i W2k? Tja, i så fall måste det ju vara en bug i PHP.
------------------
Robban < robban@lipogram.com >