Using timezones in your Python scripts
pytz allows accurate and cross platform timezone calculations using Python. Here is a small example on how to display date and time for differents timezones using a Zope Utility.
pytz - World Timezone Definitions for Python1. Create an utility which provides a getCurrentTimes fonction (file utils.py)
# Python imports
from datetime import datetime
import pytz
# Zope imports
from zope.interface import Interface, implements
from zope.component import provideUtility
class ITimezoneUtils(Interface):
""" Utilities for timezone calculations """
def getCurrentTimes(timezones, fmt=None):
""" Return current time for a list of timezones.
>>> getCurrentTimes(['Europe/London', 'Asia/Tokyo'])
{'Europe/London': datetime.datetime(2009, 7, 9, 20, 29, 26, 603590,
tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
'Asia/Tokyo': datetime.datetime(2009, 7, 10, 4, 29, 26, 603590,
tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)}
>>> getCurrentTimes(['Europe/London', 'Asia/Tokyo'], fmt='%Y-%m-%d %H:%M')
{'Europe/London': '2009-07-09 20:31',
'Asia/Tokyo': '2009-07-10 04:31'}
"""
class TimezoneUtils(object):
implements(ITimezoneUtils)
def getCurrentTimes(self, timezones, fmt=None):
# Get UTC current time
now_utc = datetime.now(pytz.timezone('UTC'))
# Compute current time for each timezone
result = {}
for tz in timezones:
now_tz = now_utc.astimezone(pytz.timezone(tz))
if fmt is not None:
now_tz = now_tz.strftime(fmt)
result[tz] = now_tz
return result
provideUtility(TimezoneUtils(), ITimezoneUtils)
- Use this utility to compute date and time for multiple timezones
>>> # Zope imports
>>> from zope.component import getUtility
>>> from utils import ITimezoneUtils
>>> tz_utils = getUtility(ITimezoneUtils)
>>> timezones = ['Europe/London', 'Asia/Tokyo', 'America/New_York']
>>> tz_utils.getCurrentTimes(timezones)
{'America/New_York': datetime.datetime(2009, 7, 9, 15, 32, 18, 910813,
tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>),
'Europe/London': datetime.datetime(2009, 7, 9, 20, 32, 18, 910813,
tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>),
'Asia/Tokyo': datetime.datetime(2009, 7, 10, 4, 32, 18, 910813,
tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)}
>>> tz_utils.getCurrentTimes(timezones, fmt='%Y-%m-%d %H:%M')
{'America/New_York': '2009-07-09 15:32',
'Europe/London': '2009-07-09 20:32',
'Asia/Tokyo': '2009-07-10 04:32'}