Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Current PHP timestamp ipv JS timestamp

Pagina: 1
Acties:

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Ik ben bezig met een veiling website en kwam er niet achter waarom de countdown steeds minder was dan dat ik uitrekende via PHP. Na een tijdje (ben nog niet zo heel lang bezig met JS) kwam ik erachter dat JS uiteraard local time pakt waar PHP de server time pakt. De 'tot' tijd is server side, alleen is de 'nu' tijd client side. Daar gaat het mis.

Ik heb een JS functie gevonden die de countdown doet, alleen dus met de client time waar ik server time nodig heb:

JavaScript:
1
var stamp_nu = Math.round(new Date().getTime()/1000);


Nu dacht ik geniaal te zijn door dit te wijzigen naar:

JavaScript:
1
var stamp_nu = <?php echo time(); ?>;


(roep een javascript.php bestand aan)

Ik krijg nu wel de juiste uitkomst qua coundown, maar het tellertje doet het niet meer. Dit komt doordat de timestamp nu 'hard' in het javascript.js.php bestandje staat en ik denk dat de code die de javascript timestamp genereert dynamisch is. Hierdoor denkt het scriptje dat 'nu' altijd hetzelfde is en dit moet gewoon on the fly.

Heeft iemand enige idee hoe ik dit kan oplossen? Als jullie volledige JS functie willen zien dan kan ik die hier ook neerplanten.

Wellicht dat er iets bestaat in JS welke een current timestamp maakt aan de hand van een opgegeven timestamp?

[ Voor 5% gewijzigd door Zenda op 20-08-2013 10:26 ]

Zenda likes some milk every now and then..


Verwijderd

Wat je eigenlijk moet doen is de server tijd met de cliënt tijd vergelijken.
Want wat als iemand zijn klok verzet? Dan krijgt deze meer tijd.

Dus als je op de server nog 10min hebt moet je de cliënt tijd + 10 min doen als eindtijd waar je naar af telt.

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Daar gaat het dus om inderdaad. Maar hoe krijg ik dat voor elkaar?

Zenda likes some milk every now and then..


Verwijderd

Doormiddel van PHP de javascript tijd goed invullen:
var stamp_nu = new Date(<? even googlen ?>)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat maakt er sowieso een Date object van, hij wil gewoon een timestamp.

Wat je moet doen is in je javascript de servertijd zetten, en ter referentie de clienttijd eenmalig laten uitrekenen zodra de javascript is ingeladen (dus niet in een functie die je later aanroept, maar gewoon in de global namespace van de JS). Door die twee dingen van elkaar af te trekken weet je het verschil tussen client en server. Die kun je vervolgens optellen bij alle tijdberekeningen die je in JS doet.

Een andere optie is dat de server gewoon rapporteert hoe lang je nog hebt. Dan kun je op de client uitrekenen wanneer dat is in clienttijd.

[ Voor 12% gewijzigd door .oisyn op 20-08-2013 11:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Oplossing:

JavaScript:
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
49
50
<script>
$exp_date = 12345678; // timestamp format

// Count down milliseconds = server_end - server_now = client_end - client_now
var server_end = <?php echo $exp_date; ?> * 1000;
var server_now = <?php echo time(); ?> * 1000;
var client_now = new Date().getTime();
var end = server_end - server_now + client_now; // this is the real end time

var _second = 1000;
var _minute = _second * 60;
var _hour = _minute * 60;
var _day = _hour *24
var timer;

function showRemaining()
{
    var now = new Date();
    var distance = end - now;
    if (distance < 0 ) {
       clearInterval( timer );
       document.getElementById('countdown').innerHTML = 'Veiling afgelopen, vernieuw voor de winnaar!';

       return;
    }
    var days = Math.floor(distance / _day);
    var hours = Math.floor( (distance % _day ) / _hour );
    var minutes = Math.floor( (distance % _hour) / _minute );
    var seconds = Math.floor( (distance % _minute) / _second );

    var countdown = document.getElementById('countdown');
    countdown.innerHTML = '';
    if (days) {
        countdown.innerHTML += 'Days: ' + days + '<br />';
    }
    if (hours) {
         countdown.innerHTML += 'Hours: ' + hours+ '<br />';
    }
    if (minutes) {
            countdown.innerHTML += 'Minutes: ' + minutes+ '<br />';
    }
    if (seconds) {
        countdown.innerHTML += 'Seconds: ' + seconds+ '<br />';
    }
}

timer = setInterval(showRemaining, 1000);
</script>

<div id="countdown"></div>

Zenda likes some milk every now and then..


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik denk dat ik het helemaal op de server op zou lossen en gewoon met een xhr op een vaste interval de overgebleven tijd op zou halen. Dat biedt allerlei voordelen, bijvoorbeeld dat als de veiling gecanceld wordt om de een of andere reden, je dat in dezelfde requestloop op kunt lossen, en je ook allerlei andere dingen erbij op kunt halen, zoals huidige bod, aantal biedingen, aantal mensen dat op dat moment naar hetzelfde bod aan het kijken is, enz enz. Dat kan dan best vaker dan eens per seconde zijn en je kunt het eenvoudig zo maken dat je in een request van meerdere items de data ophaalt.

De enige maar is dat je de server meer belast maar dat zou ik onder de noemer "premature optimization" schuiven.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:57

Matis

Rubber Rocket

Waarom niet gewoon UTC?

If money talks then I'm a mime
If time is money then I'm out of time


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Omdat dat niets oplost als iemand zijn klok vijf minuten verkeerd loopt.
Pagina: 1