Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get client's timezone? [duplicate]

I'm writting an application using Zend_Framework (so the solution can rely on it).

How to get client's timezone?

For example, if someone in Moscow, Russia, I want to get 3*60*60 (because there is UTC+3). If he is in UK, I want zero. If he uses UTC-3:30 (Canada?), I want -3.5*60*60.

(it's not a question about a format - I'm ok with getting 'Europe/Moscow' or 'UTC-3' for St. Petersburg, Russia, it's rather about getting timezone client uses. But delta in seconds is preferred)

The only solution which comes to mind is letting javascript get the local time for me and redirect.

like image 461
Valentin Golev Avatar asked Dec 15 '09 05:12

Valentin Golev


People also ask

How do you find the client time zone?

The client's timezone offset could be detected by using the Date object's getTimezoneOffset() method. The getTimezoneOffset() method returns the time difference between UTC time and local time, that is the time offset, in minutes. This offset is changed by dividing by 60 and negating the result.

How do I get timezone offset?

Definition and Usage. getTimezoneOffset() returns the difference between UTC time and local time. getTimezoneOffset() returns the difference in minutes. For example, if your time zone is GMT+2, -120 will be returned.

How do I get current timezone in typescript?

To get the current browser's time zone, you can use the getTimezoneOffset() method from the JavaScript Date object. The getTimezoneOffset() returns the time difference, in minutes, between UTC time and local time.

How do I get client time zone in laravel?

It works by listening for the user login event and setting the timezone in the database. It uses Laravel GeoIP to look up the user using an IP address. You can also convert the localized date back to UTC: 1Timezone::convertFromLocal($request->get('publish_at'));


3 Answers

Check out this article on how to detect the timezone by setting a Cookie through JavaScript that will hold the client's timezone. It's rather lenghty, but that is because it is quite verbose. I've implemented a solution along these lines in one of my own apps and it works quite well.

You could also send the timezone via Ajax to the server and have it do whatever you need to do it with then. Or, if you are not doing any serverside calculations with it, just apply the timezone client side where needed. Really depends on your usecase.

In addition to that, I suggest you let the visitor set his timezone himself and store that in the Cookie or a Session.

like image 34
Gordon Avatar answered Sep 29 '22 03:09

Gordon


I wrote a function using jQuery and PHP. This is tested, and does work!

On the PHP page where you are want to have the timezone as a variable, have this snippet of code somewhere near the top of the page:

<?php         session_start();     $timezone = $_SESSION['time']; ?> 

This will read the session variable "time", which we are now about to create.

On the same page, in the , you need to first of all include jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 

Also in the , below the jQuery, paste this:

<script type="text/javascript">     $(document).ready(function() {         if("<?php echo $timezone; ?>".length==0){             var visitortime = new Date();             var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;             $.ajax({                 type: "GET",                 url: "http://domain.com/timezone.php",                 data: 'time='+ visitortimezone,                 success: function(){                     location.reload();                 }             });         }     }); </script> 

You may or may not have noticed, but you need to change the url to your actual domain.

One last thing. You are probably wondering what the heck timezone.php is. Well, it is simply this: (create a new file called timezone.php and point to it with the above url)

<?php     session_start();     $_SESSION['time'] = $_GET['time']; ?> 

If this works correctly, it will first load the page, execute the JavaScript, and reload the page. You will then be able to read the $timezone variable and use it to your pleasure! It returns the current UTC/GMT time zone offset (GMT -7) or whatever timezone you are in.

like image 104
Westy92 Avatar answered Sep 29 '22 04:09

Westy92


This is a cookie solution with very little overhead:

  echo <<<EOE
   <script type="text/javascript">
     if (navigator.cookieEnabled)
       document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
   </script>
EOE;
  if (!isset($_COOKIE['tzo'])) {
    echo <<<EOE
      <script type="text/javascript">
        if (navigator.cookieEnabled) document.reload();
        else alert("Cookies must be enabled!");
      </script>
EOE;
    die();
  }
  $ts = new DateTime('now', new DateTimeZone('GMT'));
  $ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes'));
like image 34
Lauber Bernhard Avatar answered Sep 29 '22 03:09

Lauber Bernhard