[php] mktime(); functie gaat niet lager dan 1970

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bartosiej
  • Registratie: Juli 2005
  • Laatst online: 21:25
Ik ben bezig met het maken van een script.

Daarin gebruik ik de functie mktime();

Later kwam ik erachter dat de functie mktime niet lager gaat dan het jaar 1970.

Dus als ik bijvoorbeeld dit doe:
code:
1
2
$date = date("Y-m-d", mktime(date("G"), date("i"), date("s"), date("n"), date("d"), date("Y") - 46));
echo $date;

Dan zou ik eigelijk willen dat er 1959-08-03 uitkomt maar dan krijg ik 1970-01-01.

Weet iemand misschien hoe ik dit kan fixen?

Alvast bedankt,

bartos

Acties:
  • 0 Henk 'm!

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 03-06 16:38

Nvidiot

notepad!

Zo te zien is mktime gebaseerd op de unix timestamp, welke op 1-1-1970 begint. Die is dus niet te gebruiken voor data daarvoor...

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 16:31
mktime geeft een waarde gerekend vanaf de Unix Epoch (Januarie 1 1970) naar de door jou gespecificeerde waarde. Als jou waarde ervoor ligt gaat dat dus niet lekker werken.

Op http://nl3.php.net/mktime staan volgens mij een aantal voorbeeldjes hoe je dat kan oplossen.

Acties:
  • 0 Henk 'm!

  • phYzar
  • Registratie: November 2001
  • Laatst online: 21:03
http://nl.php.net/manual/nl/function.mktime.php
mktime -- Geef UNIX timestamp voor een date
Retourneert de Unix timestamp overeenkomend met de argumenten die meegegeven zijn. Deze timestamp is een long integer die het aantal seconden bevat tussen de Unix Epoch (January 1 1970) en de gespecificeerde time.
Beperking van de Unix timestamp dus.

Acties:
  • 0 Henk 'm!

  • phYzar
  • Registratie: November 2001
  • Laatst online: 21:03
Icey schreef op zaterdag 03 september 2005 @ 12:27:
Op http://nl3.php.net/mktime staan volgens mij een aantal voorbeeldjes hoe je dat kan oplossen.
Hier staat idd een suggestie:
http://nl3.php.net/manual/nl/function.mktime.php#38068

Acties:
  • 0 Henk 'm!

  • bartosiej
  • Registratie: Juli 2005
  • Laatst online: 21:25
die functie van die link werkt niet helemaal.... (of ik gebruik het gewoon verkeerd)

dit is in ieder geval waarvoor ik het nodig heb:

Er kan op een pagina gezocht worden naar leden door de leeftijdscategorie te selecteren:
- jonger dan 20
- tussen 20 en 45
- ouder dan 45

In de leden database staat een veld met de naam 'geboortedatum' van het type 'date' (formaat daarvan is Y-m-d).

Wat ik eerst deed was het volgende, als bijvoorbeeld de optie van tussen de 20 en 45 geselecteerd werd:
code:
1
2
3
4
$gb1 = date("Y-m-d", mktime(date("G"), date("i"), date("s"), date("n"), date("d"), date("Y") - 20));
$gb2 = date("Y-m-d", mktime(date("G"), date("i"), date("s"), date("n"), date("d") - 1, date("Y") - 46));

$query = mysql_query("SELECT * FROM users WHERE geboortedatum >= '$gb2' AND geboortedatum <= '$gb1'");


weet iemand dan misschien een andere manier om toch hetzelfde te krijgen?

[ Voor 15% gewijzigd door bartosiej op 03-09-2005 12:49 ]


Acties:
  • 0 Henk 'm!

  • Onno
  • Registratie: Juni 1999
  • Niet online
Uh..
code:
1
2
select * from users where geboortedatum between date_sub(now(), interval 45 year)
  and date_sub(now(), interval 20 year)

zoiets?

Dat gegoochel met data in php is in ieder geval niet nodig. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien een ranzige oplossing, maar zo heb ik het zelf gedaan (komt geloof ik uit een van de comments op php.net bij mktime... heb hem zelf iig niet gemaakt, maar kan me niet meer herinneren wie wel):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//
// mktime wrapper die wél data van voor 1970 snapt (negatieve timestamps dus)
//
function maketime()
{
   $objArgs = func_get_args();
   $nCount = count($objArgs);
   if ($nCount < 7)
   {
       $objDate = getdate();
       if ($nCount < 1)
           $objArgs[] = $objDate["hours"];
       if ($nCount < 2)
           $objArgs[] = $objDate["minutes"];
       if ($nCount < 3)
           $objArgs[] = $objDate["seconds"];
       if ($nCount < 4)
           $objArgs[] = $objDate["mon"];
       if ($nCount < 5)
           $objArgs[] = $objDate["mday"];
       if ($nCount < 6)
           $objArgs[] = $objDate["year"];
       if ($nCount < 7)
           $objArgs[] = -1;
   }
   $nYear = $objArgs[5];
   $nOffset = 0;
   if ($nYear < 1970)
   {
       if ($nYear < 1902)
           return 0;
       else if ($nYear < 1952)
       {
           $nOffset = -2650838400;
           $objArgs[5] += 84;
           // data van voor 1942 zijn nooit met zomertijd/wintertijd naar het schijnt...
           if ($nYear < 1942)
               $objArgs[6] = 0;
       }
       else
       {
           $nOffset = -883612800;
           $objArgs[5] += 28;
       }
   }
  
   return call_user_func_array("mktime", $objArgs) + $nOffset;
}


Wat dit doet is een Unix-timestamp retourneren, net als mktime, alleen krijg je hierbij dus bij data van vóór 1970 een negatieve timestamp. Als het goed is zou de output van deze functie dus gewoon als invoer voor functies die een timestamp verwachten moeten kunnen dienen... :)

Acties:
  • 0 Henk 'm!

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 18:19
Deze werkt idd goed, gewoon overal je date() vervangen door adodb_date()

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • bartosiej
  • Registratie: Juli 2005
  • Laatst online: 21:25
ik heb het gedaan, maar het maakt niks uit... 1970-01-01 is nog steeds de laagste waarde die ik gekregen heb..

heeft iemand misschien nog een idee?

  • bartosiej
  • Registratie: Juli 2005
  • Laatst online: 21:25
laat maar het is al gelukt!!! ik had mktime niet veranderd in adodb_mktime() ;) werkt nu EINDELIJK :P

heel erg bedankt allemaal!

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-07 15:06
Onno schreef op zaterdag 03 september 2005 @ 13:17:
Uh..
code:
1
2
select * from users where geboortedatum between date_sub(now(), interval 45 year)
  and date_sub(now(), interval 20 year)

zoiets?

Dat gegoochel met data in php is in ieder geval niet nodig. :)
Vind ik persoonlijk de mooiste oplossing.
Ikzelf laat het goochelen met data ook altijd aan MySQL over. Zonde om de PHP engine daarmee te vervelen als MySQL daar een geweldige lib voor heeft ingebakken.
Pagina: 1