I would like to know if there is a way to automatically retrieve user's timezone from client. Especially during login.
I tried to add this in the login page (using auth.login
):
{% get_current_timezone as TIME_ZONE %}
and then add this in the login form
<input type="hidden" name="next" value="/redirect/?tz={{ TIME_ZONE }}">
but tz
is always the timezone of the server.
There is a nice APP for django to activate timezone https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0. Which having two middleware
TimezoneMiddleware
The middleware activates a timezone for an authenticated user.
VisitorInformationMiddleware
This middleware adds the following keys to the request.visitor dictionary:
country - country the visitor is based in.
city - city the visitor is based in
location.timezone - timezone used in the location visitor is based in
location.unit_system - unit system used in the location visitor is based in
user.timezone - timezone of the currently authenticated user
user.unit_system - unit system of the currently authenticated user.
cookie_notice - True if a cookie consent notice should be displayed for the current visitor.
I was hunting around for the sam thing yesterday. In the end I ended up putting together a Django app to what BluesRockAddict suggests above (i.e. use getTimezoneOffset):
https://github.com/adamcharnock/django-tz-detect
I hope someone finds that useful.
From the documentation:
You can try setting timezone cookie via javascript by utilizing getTimezoneOffset function or try to do some geoip magic and figure timezone by location. Probably the most reliable way would be to ask the user directly and save this information in user profile/session.
I currently created a middleware class (following Django's documentation) in which I rely on MaxMind geoip database (http://dev.maxmind.com/geoip/legacy/geolite) and GeoDjango (https://docs.djangoproject.com/en/1.5/ref/contrib/gis/) to retrive user's country code and then set the timezone dynamically using pytz:
pytz.country_timezones
returns a collection of time zones available for the given country, so I basically choose the first one returned.IPResolver
is a personal utility class I wrote on top ofdjango.contrib.gis.utils.GeoIP
I've simplified it even further, and you can plug in in here: https://github.com/Miserlou/django-easy-timezones or http://gun.io/blog/django-easy-timezones/