Toon posts:

[Java applet / PHP] Tijdproblemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
In een hier draaiende Java - applet is het zo nu en dan nodig om de tijd naar een PHP script te posten en op te slaan in een database.

In de Java applet wordt met CurrentTimeInMillis de huidige tijd opgevraagd. (Aantal milliseconden na 1970)

Dit wordt vervolgens gepost naar een PHP - script die hier het volgende mee doet:

PHP:
1
2
$unixtime = floor((strtok($seperator) / 1000));
$timestamp = date("YmdHis", $unixtime);


Die strtok() is voor dit probleem niet interessant of noemenswaardig. Het delen door 1000 is om van miliseconden, hele seconden te maken.

Echter: Het probleem is dat er steeds een tijdverschil van 2 uur en 3 of 4 seconden zit tussen de tijd in de Java - applet en de tijd in het PHP script.

Het verschil in één seconde kunnen we verklaren door dat het PHP script met floor() naar beneden afrondt. Maar de rest kunnen we niet verklaren en dus niet oplossen. Heeft iemand hier wel een verklaring voor?

edit: Voor de duidelijkheid. Als de applet 12:04:00 registreert maakt PHP hier 10:00:00 van.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Timezone verschillen :?

Verwijderd

Topicstarter
Maar dan zou het precies twee uur verschil moeten zijn :?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 12 september 2002 @ 13:10:
Maar dan zou het precies twee uur verschil moeten zijn :?


Loopt jouw systeemklok op de seconde nauwkeurig? Je java-applet haalt immers gewoon de systeemtijd op.

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


Verwijderd

Topicstarter
Systeemtijd heeft er m.i. niet zo veel mee te maken.

De applet haalt de UNIX tijd op en displayed deze nog ergens in de applet. Vervolgens wordt dezelfde UNIX tijd naar het PHP script gepost. Dit zou dezelfde tijd op moeten leveren. Het verschil is erchter die twee uur en 4 seconde.

Iedere UNIX tijd zal toch op iedere compu overeen moeten komen met dezelfde tijd (even de timezones buiten beschouwing gelaten) ?

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Verwijderd schreef op 12 september 2002 @ 13:28:
Systeemtijd heeft er m.i. niet zo veel mee te maken.

De applet haalt de UNIX tijd op en displayed deze nog ergens in de applet. Vervolgens wordt dezelfde UNIX tijd naar het PHP script gepost. Dit zou dezelfde tijd op moeten leveren. Het verschil is erchter die twee uur en 4 seconde.

Iedere UNIX tijd zal toch op iedere compu overeen moeten komen met dezelfde tijd (even de timezones buiten beschouwing gelaten) ?
Hoe denk je dat die computer de tijd bepaalt? Uiteraard aan de hand van de interne klok, die jij gewoon kunt instellen, inclusief allerlei leuke dingen met time zones.

Kun je in de source van die applet precies zien wat er met de opgehaalde tijd gebeurt? Ergens moet er iets worden gedaan als
code:
1
long currentTime = System.currentTimeMillis();
Als die currentTime inderdaad ongewijzigd wordt doorgegeven aan je PHP script dan lijkt het me duidelijk waar het probleem optreed. Die vier seconden verschil is mogelijk te verklaren uit systeemklokken die niet gelijk lopen, die 2 uur lijkt wel heel erg veel op een time zone verschil.

Gelukkig ;) weet ik niets van PHP, maar het lijkt me sterk dat die applet opeens een variabele waarde aanpast. Ik zou toch beginnen met het vergelijken van de systeemklokjes van de client waar de applet op draait en de server die de PHP uitvoert...

With the light in our eyes, it's hard to see.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 17-08 22:44
Ja, pcies...

Applet is client side. PHP is server side.

Dus sowieso heb je een vertraging vanwege deze communicatie. Zelfs als je de applet op de server draait. Daarnaast zou ik inderdaad is in de javadocs kijken hoe de tijd in milliseconden opgevraagd wordt, er gebeurt namelijk wel een aanpassing op basis van een tijdzone.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

nou...
Als hij doet: request.php?time=timestamp en in zijn
php: extract_time($time) zou er geen verschil mogen zijn, behalve dan dat php standaard misschien naar een andere timezone extract en er dus een precies verschil van enkele uren mag zijn.
En wellicht dat er wat afronding fout gaat trouwens.

Verwijderd

Topicstarter
ACM schreef op 12 september 2002 @ 23:40:
En wellicht dat er wat afronding fout gaat trouwens.
Maar dat is volgens mij maximaal 1 seconde, die wordt veroorzaakt door de

PHP:
1
floor($timestamp / 1000)


En dan hou ik dus nog en aantal seconden over...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 12 september 2002 @ 13:28:
Systeemtijd heeft er m.i. niet zo veel mee te maken.

De applet haalt de UNIX tijd op en displayed deze nog ergens in de applet. Vervolgens wordt dezelfde UNIX tijd naar het PHP script gepost. Dit zou dezelfde tijd op moeten leveren. Het verschil is erchter die twee uur en 4 seconde.

Iedere UNIX tijd zal toch op iedere compu overeen moeten komen met dezelfde tijd (even de timezones buiten beschouwing gelaten) ?

Nee, UNIX timestamp is gewoon het aantal seconden (of milliseconden) sinds een bepaald tijdstip. Het is gewoon een weergave waarmee veel makkelijker gerekend kan worden dan bijvoorbeeld een DMY formaat. Het wordt gewoon bepaald aan de hand van de systeem klok (hint: tijd vraag je op bij het System object). Waneer jij je lokale klok een paar minuten verkeerd hebt lopen zal de uitkomst van System.currentTimeInMillis() ook die paar minuten verkeerd lopen.

Hoe dacht jij dan dat die tijd werd opgehaald? Opgevraagd bij een of andere timeserver op internet? En hoe zou java dan aan de tijd komen bij een computer die helemaal neit online is?

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


  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Verwijderd schreef op 13 september 2002 @ 09:18:
[...]

Maar dat is volgens mij maximaal 1 seconde, die wordt veroorzaakt door de

PHP:
1
floor($timestamp / 1000)


En dan hou ik dus nog en aantal seconden over...
Die worden verklaart omdat JAVA clinetside is, en PHP serverside. De tijd om het request te voltooien is een aantal seconden. Het verschil van 2 uur smells like timezones :)

Verwijderd

Topicstarter
Ik begrijp wel de UNIX tijd van de systeemtijd wordt uitgelezen, maar ik snap niet dat die het systeem kan beinvloeden.

Als ik dit PHP-script

PHP:
1
2
3
4
5
6
7
8
<?php
 $time = mktime();

 $time_string = date("d/m/Y H:i:s", $time);

 echo "$time, $time_string";

?>


run krijg ik deze uitvoer:
1031910177, 13/09/2002 09:42:57
Als ik nu per mail de UNIX time naar jou toe mail, en jij gaat drie dagen later die UNIX (1031910177) timestamp converteren naar een leesbare datum, dan komt daar nog steeds 13/09/2002 09:42:57 uit. Met misschien een timezone correctie, maar verder niet.

Snap ik het nou echt niet, of begrijpen we elkaar gewoon niet?

[ Voor 0% gewijzigd door Verwijderd op 13-09-2002 11:51 . Reden: typo ]


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 17-08 22:44
ja hallo, hoe denk je dat die unix tijd bepaald wordt?
Aan de hand van de interne klok natuurlijk.

Hoe bepaald Java de tijd?
Aan de hand van de interne klok natuurlijk.

En waar zit die interne klok?
Op je moederbord lijkt me.

PHP draait server side, in je webserver zeg maar.
Java draait client side, in je browser zeg maar.

En daar kan prima een verschil in zitten. Zelfs als het op hetzelfde systeem gedraaid wordt. D'r gaat namelijk ook wat tijdi nde verwerking zitten namelijk. En de exacte momenten wanneer je de tijd opvraagt in je applicatie maakt ook nog is uit.

Hoe het Timezone verschil op kan treden? Mijn gok is dat je de interne klok op lokale tijd hebt staan. Java gaat er geloof ik van uit dat de klok draait op GMT, tenzij je dit in een prefs file aanpast.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

The - DDD: FOUT :)

Als jij een unix-timestamp krijgt, moet daar ALTIJD dezelfde gewone tijdswaarde uitrollen, behalve als er timezone verschillen zijn, dan kan het "1 januari 1970 0:00" op een ander moment zijn.

Maar dat is absoluut niet onderhevig aan veranderingen of fout lopen van systeem klokken op het moment dat je het probeert om te zetten...

Je mist het punt dat er maar op een plek de tijd wordt opgevraagd en dat ie op beide plekken wordt omgezet om hem te bekijken ;)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 17-08 22:44
Zei ik wat anders dan? Ik zei dat de tijdsbepaling voor zowel unix tijd als java tijd de interne klok wordt geraadpleegd. En die geeft inderdaad een tijdsverschil aan met 1 januari 1970.

Verschil java en unix: milliseconden of seconden.

Echter als je je interne klok daadwerkelijk op de lokale tijd hebt in gesteld zoals die is volgens je tijdzone, dan zou er inderdaad een verschil op kunnen treden met java. Java moet je namelijk dan configureren om de interne klok te interpreteren als een tijd anders dan UTC. Windows kun je daar ook voor configureren, of de interne klok dus op UTC staat of op local time.

Stel dat je windows wel hebt geconfigureerd op local time, wat standaard gebeurt in een installatie, dan zal java altijd een andere tijd genereren dan wat er op de klok staat. Met een vast verschil vanwege de tijdzones. Verder heb je daarnaast nog zomer en winter tijd. Dat kan ook nog een afwijking veroorzaken.

Daylightsaving time en een tijdzone ernaast tel het op en je komt op 2 uur.

In java moet je altijd goed opletten hoe je tijd instellingen zijn gedaan. Doe je dat niet, dan is het een bron van koppijn. Stel dat de interne klok op local time staat. En java denkt dat het UTC is. Vervolgens ga je lekker proggen en vertel je java om de tijdzome aan te passen naar local time. Kut een dubbele correctie.

Echter als je java goed ingesteld hebt dan gaat het automatisch goed en weet denkt java vanzelf in de juiste tijdzone. Bijkomend probleem is dat windows geloof ik uit gaat van GMT. GMT en UTC is inweze hetzelfde. Echter UTC gaat uit van een atoomklok en GMT van astronomische opservaties. Daarnaast zijn computer klokken niet zo precies. Zo ongeveer om de 2 jaar is er een soort schrikkel seconde, terwijl een computer klok meestal gewoon zegt dat een jaar 86400 seconden bevat. (behalve een scrikkeljaar)

Verder nog dit, ga je java installatie directory is nazoeken op een properties file (.prop). Kijk daar is in naar een setting voor "user.timezone".
Pagina: 1