Joshp.23
Joshp.23

Reputation: 103

javascript function to round current time (from epoch) to nearest minute

I've been banging my head against the wall trying to get a JavaScript equivalent to this php snippet:

<?php
$id  = 'uniqueID'
$now = round(time()/60);
$lock = md5($now . $id);
?>

I've been trying variations on this:

var timeInMin = new Date().getTime() / 60000;
var timestamp = Math.round(timeInMin);
var key = md5(timestamp + 'uniqueID');

utilizing an md5 script from here

I merely need lock and key to match. Seems simple to me. What am I doing wrong?

Upvotes: 0

Views: 291

Answers (2)

Yaron Meiner
Yaron Meiner

Reputation: 164

As said before me, if time not matching it will not create the same hash. What I do in situations like that is to find way to pass the time from php to the client side so they can use the same exact time.

PHP side:

<?php
    $id  = 'uniqueID';
    $now = round(time()/60);
    $lock = md5($now . $id);
    print $lock;
    setcookie("time",$now);
?>

Client Side:

<script type="text/javascript">
    var timestamp = getCookie("time");
    var key = md5(timestamp + 'uniqueID');
    console.log(key);
</script>
  • Note that getCookie is a shortcut function
  • The following example is here to present the idea in a simple form. I would not use time as the name of the cookie nor give access to the vars (wrap in function). Uglify scripts goes a long way in cases like this.

Upvotes: 1

Jared Smith
Jared Smith

Reputation: 22029

To put it in concrete terms (my comment was slightly facetious):

PHP is a server-side language. When your browser fires a request for a page over the internet (or even to a listening port on your local machine), the instance of apache running on the server (or your local machine) executes the PHP on the page, then spits it back out to the browser.

The browser then executes any JavaScript on the page, we refer to this as client-side.

Because you are using Math.round, if it takes more than 30 seconds between the time your server executes the PHP (server-side) and the time your browser starts executing the relevant Javascript (client-side) then the time in minutes will be different. Using Math.floor instead would give you 59 seconds of wiggle room but that's still dicey, especially on mobile.

Even assuming the page executes the JavaScript immediately after loading and loads pretty quickly 30 seconds of latency is not totally off the table, and on mobile neither is 59.

Upvotes: 0

Related Questions