[PHP] Rekenen met date() waarden

Pagina: 1
Acties:
  • 365 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi, ik zit nu al een tijdje te worstelen met het volgende probleem: ik wil met waarden van date(), weliswaar in dezelfde structuur, kunnen rekenen. Bijvoorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$vorigjaar = '2004';
$ditjaar = date('Y');
echo $ditjaar - $vorigjaar; // 1

// of iets uitgebreider:

$vroeger = '1970-12-09';
$nu = date('Y-m-d');
$verschil = $nu - $vroeger; // geen idee :S

?>

Nu weet ik dat dit met MySQL wél kan, ik gebruik PHP ook icm met MySQL, maar ik wil het per se in PHP kunnen. Rekenen met een string is nu eenmaal niet zo makkelijk. ;(

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022

Reveller

Hopla!

Volgens mij moet je eerst bepalen wat je nu precies wilt berekenen: als je een precieze datum en tijd hebt, kun je deze makkelijk omzetten naar een timestamp. Vervolgens neem je de huidige timestamp; je rekent het verschil uit en dat kun je terugrekenen naar aantal jaren, dagen etc.

Als je zoals in je eerste voorbeeld, de string '2000' wil omzetten naar een integer (waar je wel mee kunt rekenen) kun je dat doen met settype.

[ Voor 29% gewijzigd door Reveller op 08-06-2005 19:00 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer hetzelfde te bereiken als met de rekenfunctie van MySQL. Het eerste voorbeeld is inderdaad makkelijk te berekenen, maar kijk naar het tweede voorbeeld. Er is geen "date" type ofzoiets, waarmee je settype kan gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 08 juni 2005 @ 18:55:
Ik probeer hetzelfde te bereiken als met de rekenfunctie van MySQL. Het eerste voorbeeld is inderdaad makkelijk te berekenen, maar kijk naar het tweede voorbeeld. Er is geen "date" type ofzoiets, waarmee je settype kan gebruiken.
Reveller zei het al. Zet het dan om naar een unix timestamp.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Het probleem met timestamps is dat je last hebt van schrikkeljaren, maanden met verschillend aantal dagen, zomertijd, etcetera. Waar het eea nogal vanaf hangt is wat je er precies mee wil bereiken. Het schrijven van een complete datum-functie a la mysql's datediff zal namelijk redelijk bewerkelijk zijn...

edit:
Datediff() valt bij nader inzien nogal mee, die doet alleen het verschil in dagen. De vraag wat je precies wil berekenen blijft echter staan :)

[ Voor 23% gewijzigd door T-MOB op 08-06-2005 20:14 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Het makkelijkste lijkt me om gewoon een Calendar class te gebruiken die dit allemaal voor jouw regelt. Dit is een zo'n universeel probleem, dat het zonde is om dit zelf te gaan oplossen als dit al 10.000 keer eerder gedaan is.

Met een Calendar class maak je simpelweg eerst twee Calendar object aan die je init met de datums die je hebt (als je niet volledig bent, dus alleen zeg alleen 2004, dan vult een goede calendar zelf defaults in voor de andere veleden). Vervolgens gebruik je de functies van de Calendar class om de data van elkaar af te trekken of op te tellen. De Calendar zorgt dan zelf voor dingen als schrikkeljaren etc.

Zoiets zit vast wel in PHP. Mocht het er toch niet inzitten en wil je zelf wat maken dan kun je wellicht even kijken naar de Calendar of GregorianCalendar zoals die in Java zitten en mischien vanaf de source wat inspiratie op doen :)

Acties:
  • 0 Henk 'm!

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Is er niet net zoals in asp een datediff functie ?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Het probleem is dat het resultaat van een date niet een date is. Een dat is een specifiek moment. Het verschil tussen twee tijdstippen is dat niet, het verschil is een lengte, uit te drukken in een tijdseenheid (maanden, jaar, dagen enz enz).

Sowieso zijn berekeningen op datums een beetje vreemd. Wat zou bijvoorbeeld datum1 + datum 2 moeten voorstellen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op woensdag 08 juni 2005 @ 22:22:
Het probleem is dat het resultaat van een date niet een date is. Een dat is een specifiek moment. Het verschil tussen twee tijdstippen is dat niet, het verschil is een lengte, uit te drukken in een tijdseenheid (maanden, jaar, dagen enz enz).

Sowieso zijn berekeningen op datums een beetje vreemd. Wat zou bijvoorbeeld datum1 + datum 2 moeten voorstellen?
Twee data bij elkaar optellen is natuurlijk onzin, maar je kunt wel het verschil willen berekenen, en die tijdseenheid dan weer weergeven in verschillende eenheden:

Hoeveel dagen zaten er tussen 1997 en 2005? oid.

Optellen kun je natuurlijk niet met twee datums doen, maar je kunt wel een datum pakken en daar dan bijvoorbeeld 100 dagen bij optellen.

Met een mooie abstracte Date of Calender class kun je zulksoort dingen doen zonder dat je zelf hoeft na te gaan hoeveel dagen welke maand precies had en welk jaar schrikkel was etc. In Java heb je een makkelijk te gebruiken implementatie hiervan (toepasselijk Calender genoemd).

In PHP zal heus ook wel zoiets zitten?

Acties:
  • 0 Henk 'm!

  • mosymuis
  • Registratie: Maart 2002
  • Laatst online: 27-04 11:53
T-MOB schreef op woensdag 08 juni 2005 @ 20:10:
Het probleem met timestamps is dat je last hebt van schrikkeljaren, maanden met verschillend aantal dagen, zomertijd, etcetera.
Timestamps houden toch wel degelijk rekening met dit alles? Je kunt met date() de dag in de maand uitrekenen, wel/geen schrikkeljaar boolean, enz. Zomertijd inderdaad niet, echter dat ondervang ik altijd door de datum te formatteren met gmdate en er bij de meegegeven timestamp een variabel aantal uren bij op te tellen. Zo kan je ook tijdszones toepassen.
Pagina: 1