[PHP] Tijdsbepaling / controle

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Beste Tweakers,

Ik ben bezig met een kleine website waarop statistieken uit het Travian spel te zien zijn. Nu wil ik dat als je de statistieken opvraagt, hij kijkt wanneer deze voor het laatst gegenereerd zijn. Is dat voor 08:00 's ochtends, dan moet hij zijn gegevens gaan updaten en een nieuwe uitvoer genereren.

Echter ik kom zelf vast te zitten bij de tijdsbepaling. Tot nu toe heb ik geprobeerd om te bepalen of het bestand meer dan 24 uur oud is, zo ja, dan moet ie de gegevens gaan ophalen. Echter de uitkomst van die berekening klopt niet, hij telt er standaard 1 uur bij op, de minuten en seconden kloppen verder wel.
PHP:
1
2
3
4
5
6
7
// Wanneer is het gemaakt?
$gemaakt =  date("F d Y H:i:s", filemtime($filename));

// Hoe laat is het nu?
$nu = date("F d Y H:i:s");

$verschil = date("H:i:s", (strtotime($nu) - strtotime($gemaakt)));


Het liefst wil ik eigenlijk dat hij controleert of de tijd waarop het gemaakt is, later ligt dan 08:00 die dag, maar de ideeën die ik daarvoor in mijn hoofd heb zitten, krijg ik niet overgezet in PHP.

Hopelijk kan iemand van jullie mij een eindje op weg helpen en tevens verklaren waarom bovenstaande een verschil van 1 uur oplevert.

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Print de tijden eens uit voordat je er mee gaat rekenen.
Dan kan je waarschijnlijk al zien waar het probleem ligt, een tijdzone ofzo. :)

Verder snap ik niet waarom je eerst je tijden naar leesbaar formaat converteert, om ze daarna weer naar een integer te converteren om ermee te kunnen rekenen.

PHP:
1
2
3
4
5
6
$achtuur  = mktime ( 8, 0, 0, date('m'), date('d'), date('Y'));
$gemaakt = filemtime($filename);

if ($gemaakt > $achtuur) {
  bladiebla
}

[ Voor 21% gewijzigd door Gonadan op 04-06-2007 16:15 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Een heel andere oplossing: Waarom maak je geen cronjob of taak schudular welke elke dag om 08:00 het script aan roept welke de statistieken berekend? Wordt je site niet bezocht worden de gegevens toch bijgewerkt en zo voorkom je dat 1 gebruiker heel lang moet wachten omdat de gegevens bij gewerkt moeten worden. Gewoon automatisch door het systeem laten doen.

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Als je nu eens wacht met het converteren van je tijdstippen naar een string en gewoon met de unix timestamps werkt. Converteren naar strings moet je eigenlijk pas doen op het moment dat je het af gaat drukken (op het scherm).

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!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Gonadan schreef op maandag 04 juni 2007 @ 16:12:
Print de tijden eens uit voordat je er mee gaat rekenen.
Dan kan je waarschijnlijk al zien waar het probleem ligt, een tijdzone ofzo. :)

Verder snap ik niet waarom je eerst je tijden naar leesbaar formaat converteert, om ze daarna weer naar een integer te converteren om ermee te kunnen rekenen.
Dat had ik al gedaan, die weergave klopte, echter na de berekening zat er altijd 1 uur te veel bij.
Ik krijg de tijdzone niet opgevraagd, als ik date_timezone_get() gebruik krijg ik een error dat die functie niet gedefinieerd is.

Als ik jouw voorbeeld gebruik, dan krijg ik inderdaad wel het verschil tussen 8 uur 's ochtends en de tijd waarop het document is gemaakt. Bouw ik hem echter een beetje om, dat ik wil bepalen hoe oud het bestand is, krijg ik weer hetzelfde probleem als hierboven, 1 uur te veel.

PHP:
1
2
3
4
5
6
7
    $gemaakt = filemtime($filename);
    $nu =  time();
    $verschil2 = $nu - $gemaakt;
    
    echo date("H:i:s", $nu)."<br />";
    echo date("H:i:s", $gemaakt)."<br />";
    echo "Het bestand is ". date("H:i:s", $verschil2) ." oud<br/>";


Uitvoer:
code:
1
2
3
16:37:23
15:32:50
Het bestand is 02:04:33 oud
x-force schreef op maandag 04 juni 2007 @ 16:14:
Een heel andere oplossing: Waarom maak je geen cronjob of taak schudular welke elke dag om 08:00 het script aan roept welke de statistieken berekend? Wordt je site niet bezocht worden de gegevens toch bijgewerkt en zo voorkom je dat 1 gebruiker heel lang moet wachten omdat de gegevens bij gewerkt moeten worden. Gewoon automatisch door het systeem laten doen.
Ik weet niet hoe cronjobs werken. Op de server staat DirectAdmin en daar zit wel zoiets bij, maar ik heb geen idee hoe dat werkt, vandaar deze oplossing. Al ben ik er wel van overtuigd dat een cronjob beter zou zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Cronjob in DA is niet moeilijk en wel handig dan zelf te scripten

Gewoon tijd opgeven (elke dag om 8 uur dus) en dan path naar het script en klaar
Staat volgens mij wel een help bij, zoniet staat t op internet

http://www.site-helper.com/misc.html

En dan scrollen naar Cronjobs

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Verwijderd schreef op maandag 04 juni 2007 @ 16:47:
Cronjob in DA is niet moeilijk en wel handig dan zelf te scripten

Gewoon tijd opgeven (elke dag om 8 uur dus) en dan path naar het script en klaar
Staat volgens mij wel een help bij, zoniet staat t op internet

http://www.site-helper.com/misc.html

En dan scrollen naar Cronjobs
Hmm, dat ziet er makkelijker uit dan ik dacht :$
Denk dat ik het dan toch maar met die cronjob ga doen.

Wil overigens niet zeggen dat ik geen antwoord meer wil op het probleem, want snap er niets meer van waarom het niet wil werken.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom het niet werkt is vrij simpel; het verschil is het aantal seconden tussen wanneer het bestand gemaakt is en nu. Vervolgens gooi jij die door de date functie. Echo die waarde eens met dag, maand en jaar erbij, wat krijg je dan?

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Cartman! schreef op maandag 04 juni 2007 @ 18:52:
Waarom het niet werkt is vrij simpel; het verschil is het aantal seconden tussen wanneer het bestand gemaakt is en nu. Vervolgens gooi jij die door de date functie. Echo die waarde eens met dag, maand en jaar erbij, wat krijg je dan?
Dan geeft ie 1 januari 1970 + tijdsverschil met weer het uur 1 meer, maar het moet toch mogelijk zijn om 2 tijden van elkaar af te trekken en het verschil daarvan te krijgen?

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Crazybyte schreef op maandag 04 juni 2007 @ 18:58:
Dan geeft ie 1 januari 1970 + tijdsverschil met weer het uur 1 meer, maar het moet toch mogelijk zijn om 2 tijden van elkaar af te trekken en het verschil daarvan te krijgen?
Jouw methode zou ook gewoon moeten werken.
Ik zie even niet wat het probleem is, erg vreemd. 8)7
Waarschijnlijk is het erg logisch, maar kijken we er overheen. :+

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Crazybyte schreef op maandag 04 juni 2007 @ 18:58:

Dan geeft ie 1 januari 1970 + tijdsverschil met weer het uur 1 meer, maar het moet toch mogelijk zijn om 2 tijden van elkaar af te trekken en het verschil daarvan te krijgen?
Als je twee timestamps van elkaar aftrekt krijg je het verschil in seconden. Een tijdsduur.
Een tijdsduur mag je niet zomaar formatteren alsof het een tijdstip is. Dat algoritme houdt tekening met wintertijd, tijdzones, en een paar speciale "regels". Dit zou alleen goed werken als je de tijdzone instelt op GMT. Alleen daar was het om 0:00 GMT precies 0:00 uur, hier was het namelijk 1:00 uur. Maar dit zou ook weer niet goed werken bij heel grote eenheden, vanwege zomertijd, schrikkeljaren, etc. Denk hier dus even over na voor je een tijdsduur formatteert.

Acties:
  • 0 Henk 'm!

  • Guru Evi
  • Registratie: Januari 2003
  • Laatst online: 24-08 19:45
Ik denk dat de ene functie die je gebruikt je tijdszone (GMT+1) erbij telt en de andere niet? Meestal worden je timestamps in GMT opgeslaan, terwijl je, als je de tijd functioneel opvraagt, hij er je tijdszone bijrekent. Het kan ook zijn dat gewoon je BIOS-time en je systeemtime verschillen (de ene gebruikt GMT, de andere GMT+1).

Probeer eens een bestand aan te maken binnen PHP en in hetzelfde script je berekeningen uit te voeren.

[ Voor 69% gewijzigd door Guru Evi op 04-06-2007 19:16 ]

Pandora FMS - Open Source Monitoring - pandorafms.org


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Verwijderd schreef op maandag 04 juni 2007 @ 19:11:
[...]

Als je twee timestamps van elkaar aftrekt krijg je het verschil in seconden. Een tijdsduur.
Een tijdsduur mag je niet zomaar formatteren alsof het een tijdstip is. Dat algoritme houdt tekening met wintertijd, tijdzones, en een paar speciale "regels". Dit zou alleen goed werken als je de tijdzone instelt op GMT. Alleen daar was het om 0:00 GMT precies 0:00 uur, hier was het namelijk 1:00 uur. Maar dit zou ook weer niet goed werken bij heel grote eenheden, vanwege zomertijd, schrikkeljaren, etc. Denk hier dus even over na voor je een tijdsduur formatteert.
Dat begrijp ik, maar ik zie niet wat ik anders doe dan in het voorbeeld van Gonadan. Als je daar de 2 waardes van elkaar aftrekt, krijg je wel exact het verschil tussen de tijd 's ochtends en de tijd waarop het bestand gemaakt is. Echter bij mij zit er een uur tussen.

Bij de manier van Gonadan kijk ik hoe oud het bestand is in vergelijking met de tijd 8 uur 's ochtends (dit was overigens het oorspronkelijk doel). Bij mijn manier wil ik kijken hoe oud het bestand is op het moment dat ik de pagina aanroep. Toch klopt het bij Gonadan wel en bij mij zit er een uur meer tussen, ik vraag me af hoe dat kan, aangezien ik toch echt dezelfde manier toepas.

Acties:
  • 0 Henk 'm!

Verwijderd

De Unix epoch was om middernacht op 1 januari 1970 UTC. We zitten hier niet in dezelfde tijdzone als UTC. Het maakt niet uit of je hardware clock op UTC staat of op local time. Als je klok goedstaat, loopt hij nu in Nederland één uur voor op UTC.
Het probleem is de tijdzone. Die compenseer je ofwel door je hardware klok in te stellen op UTC aan te geven welke tijdzone je wilt gebruiken, ofwel door je hardware klok op local time te zetten en aan te geven dat je al hebt gecompenseerd.

Als je het aantal seconden meet dat je PC aanstaat. Na 24 uur is dat 86400 seconden. Na 365 keer 24 uur is dat 31536000 seconden. Dat is geen jaar. Maar als je een tijdsduur behandelt als datum, krijg je dus rare effecten. Het is door dit topic maar weer duidelijk voor hoeveel verwarring dit kan zorgen.

Nog even terug naar het probleem: als je wilt dat elke dag om 8:00 statistieken worden gegenereerd, kijk dan naar de datum, en of er voor die datum al statistieken zijn. Maak eerst een lockfile (mutex), controleer, en genereer de statistieken als die er nog niet zijn en het is 8.00 uur geweest. Als ze er wel zijn is je script klaar.

Nog beter: gebruik een cron job.

Acties:
  • 0 Henk 'm!

Verwijderd

Crazybyte schreef op maandag 04 juni 2007 @ 19:17:

Dat begrijp ik, maar ik zie niet wat ik anders doe dan in het voorbeeld van Gonadan. Als je daar de 2 waardes van elkaar aftrekt, krijg je wel exact het verschil tussen de tijd 's ochtends en de tijd waarop het bestand gemaakt is. Echter bij mij zit er een uur tussen.
Er zit ook een uur tussen. Maar als jij 1 uur UTC weergeeft, komt daar in deze tijdzone (Nederland, CET), dus 2 uur uit rollen.
Bij de manier van Gonadan kijk ik hoe oud het bestand is in vergelijking met de tijd 8 uur 's ochtends (dit was overigens het oorspronkelijk doel). Bij mijn manier wil ik kijken hoe oud het bestand is op het moment dat ik de pagina aanroep. Toch klopt het bij Gonadan wel en bij mij zit er een uur meer tussen, ik vraag me af hoe dat kan, aangezien ik toch echt dezelfde manier toepas.
Kijk naar mijn vorige post. Vergelijk niet de "leeftijd" van het oude bestand, maar kijk hoe laat het is.

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
@Cheatah:

Bedankt voor de uitleg, het is me grotendeels duidelijk nu, in ieder geval waar het probleem zit. Echter het nog in de praktijk brengen, in ieder geval zo het script aanpassen dat het dus wel klopt, dat lukt me niet. Ik heb dan ook maar gewoon besloten om het via een cronjob te doen, met die link van speedydre gaat het me wel lukken om die in te stellen.

Acties:
  • 0 Henk 'm!

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 19-09 02:45
Mocht het met "normale" cronjobs niet lukken, dan kun je altijd nog http://www.webcron.org proberen, zo kun je een script op een bepaald tijdstip aanroepen over HTTP. Mocht je het toch door de gebruiker willen laten doen, request het script dan niet via een include, maar via een verborgen (i)frame, of met javascript, zo hoeft de bezoeker niet zolang te wachten op zijn pagina, en wordt ondertussen het script wel uitgevoerd.

Specificaties | AndriesLouw.nl

Pagina: 1