Hola,
Has probado con pytz [1]
La parte mas complicada es entender que datetime trabaja por defecto sin la información del timezone, por lo que una vez que obtenemos una fecha con datetime hay que añadir esa información (marcarla como local).
Una vez que la tenemos "localizada" podemos convertirla a UTC y normalizarla para poder operar en los límites de una zona horaria que provoca el cambio de zona.
A partir de aquí ya podemos utilizar los timezones de pytz para mostrarla para la zona horaria que queramos.
Ejemplo con python 2.7.3
import pytz, datetime
# Definimos las zonas horarias
utc = pytz.utc
madrid = pytz.timezone('Europe/Madrid')
bogota = pytz.timezone('America/Bogota')
melbourne = pytz.timezone('Australia/Melbourne')
caracas = pytz.timezone('America/Caracas')
los_angeles = pytz.timezone('America/Los_Angeles')
# obtenemos la fecha
dt = datetime.datetime.now()
# Localizamos la fecha con la informacion de la timezone
# En mi caso utilizando la timezone de madrid
local_dt = madrid.localize(dt)
# Una vez localizada hacemos la conversion a utc y normalizamos
utc_dt = utc.normalize(local_dt.astimezone(utc))
# Ahora podemos hace la conversion al timezone normalizando utc_dt
bogota_dt = bogota.normalize(utc_dt)
melbourne_dt = melbourne.normalize(utc_dt)
caracas_dt = caracas.normalize(utc_dt)
los_angeles_dt = los_angeles.normalize(utc_dt)
# Prueba
fmt = '%Y-%m-%d %H:%M:%S'
print 'UTC = ', utc_dt.strftime(fmt)
print 'Los Angeles =', los_angeles_dt.strftime(fmt)
print 'Bogota =', bogota_dt.strftime(fmt)
print 'Caracas =', caracas_dt.strftime(fmt)
print 'Madrid =', local_dt.strftime(fmt)
print 'Melbourne =', melbourne_dt.strftime(fmt)