Drupal allows users to set their own timezone, but that is only for authenticated users; there isn't a setting for anonymous users. Even drupal_get_user_timezone()
doesn't return anything useful for anonymous users, since (for anonymous users) it returns the default timezone set in PHP (i.e. on server side).
The only way to detect the user timezone is from JavaScript, which is exactly what Drupal does to auto detect the timezone used as default in the user profile edit form, when the user has not set their own timezone, yet. See misc/timezone.js.
var dateString = Date();
// In some client environments, date strings include a time zone
// abbreviation, between 3 and 5 letters enclosed in parentheses,
// which can be interpreted by PHP.
var matches = dateString.match(/\(([A-Z]{3,5})\)/);
var abbreviation = matches ? matches[1] : 0;
// For all other client environments, the abbreviation is set to "0"
// and the current offset from UTC and daylight saving time status are
// used to guess the time zone.
var dateNow = new Date();
var offsetNow = dateNow.getTimezoneOffset() * -60;
// Use January 1 and July 1 as test dates for determining daylight
// saving time status by comparing their offsets.
var dateJan = new Date(dateNow.getFullYear(), 0, 1, 12, 0, 0, 0);
var dateJul = new Date(dateNow.getFullYear(), 6, 1, 12, 0, 0, 0);
var offsetJan = dateJan.getTimezoneOffset() * -60;
var offsetJul = dateJul.getTimezoneOffset() * -60;
var isDaylightSavingTime;
// If the offset from UTC is identical on January 1 and July 1,
// assume daylight saving time is not used in this time zone.
if (offsetJan == offsetJul) {
isDaylightSavingTime = '';
}
// If the maximum annual offset is equivalent to the current offset,
// assume daylight saving time is in effect.
else if (Math.max(offsetJan, offsetJul) == offsetNow) {
isDaylightSavingTime = 1;
}
// Otherwise, assume daylight saving time is not in effect.
else {
isDaylightSavingTime = 0;
}
// Submit request to the system/timezone callback and set the form field
// to the response time zone. The client date is passed to the callback
// for debugging purposes. Submit a synchronous request to avoid database
// errors associated with concurrent requests during install.
var path = 'system/timezone/' + abbreviation + '/' + offsetNow + '/' + isDaylightSavingTime;
var element = this;
$.ajax({
async: false,
url: settings.basePath,
data: { q: path, date: dateString },
dataType: 'json',
success: function (data) {
if (data) {
$(element).val(data);
}
}
});
You can use a similar approach.
- Using JavaScript, you detect the timezone for the user
- You make an AJAX call to make Drupal (or your module) know the timezone