I would like to get the current user's timezone name so it can be used with the PHP date_default_timezone_set(). After looking up a few things I've finally managed to come up with a solution for this. I'm not great with code though so any code checks/help will be appreciated.
As long as it is a fair guess of the user's timezone, it is good enough for me. It seems to work OK. Here it is:
/**
* JS/jQuery - Set cookie of current user's UTC offset (format example: -06:00)
*
*/
$(document).ready( function() {
// Get UTC offset
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
var offset = (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
if (document.cookie.indexOf("hp_time_offset") >= 0) {} else {
// Set cookie
$.cookie( 'hp_time_offset', offset, { expires : null, path:'/' } );
}
});
/**
* PHP - Get the UTC offset cookie and convert it to a timezone name
*
*/
function hp_get_timezone() {
if( isset( $_COOKIE['hp_time_offset'] ) ) {
$time_offset = $_COOKIE['hp_time_offset'];
// validate - exit if offset cookie contains anything other than "0-9 + - :",
if ( preg_match('/[^0-9:\+\-]/', $time_offset) )
return;
// validate - exit if offset cookie is not in correct range
if ( ! in_array($time_offset, range(-12, 14)))
return;
// Calculate seconds from offset
list($hours, $minutes) = explode(':', $time_offset);
$seconds = $hours * 60 * 60 + $minutes * 60;
// Get timezone name from seconds
$tz = timezone_name_from_abbr('', $seconds, 1);
// bug fix
if($tz === false)
$tz = timezone_name_from_abbr('', $seconds, 0);
// if still false, set a default timezone name.
if($tz === false)
$tz = 'America/New_York';
} else {
// If cookie doesn't exist, set a default timezone name.
$tz = 'America/New_York';
}
return $tz;
}
//set timezone
date_default_timezone_set( hp_get_timezone() );
Any help appreciated.