2012-11-20 4 views
6

Dans OpenERP, lorsque j'essaie d'imprimer la date et l'heure actuelles, j'imprime toujours l'heure UTC. Mais je veux avoir du temps dans le fuseau horaire de l'utilisateur. Chaque utilisateur a un fuseau horaire différent. For example 'CST6CDT', «États-Unis/Pacifique» ou «Asie/Calcutta». J'ai donc besoin de temps dans le fuseau horaire de l'utilisateur pour que je puisse afficher la date et heure exacte dans le rapport. J'ai essayé de changer le fuseau horaire en utilisant les fonctions localize() et replace() dans le module datatime. Mais je n'ai pas eu la bonne sortie.Comment obtenir le fuseau horaire local de l'utilisateur autre que le fuseau horaire du serveur (UTC) en python?

Répondre

9

Vous l'avez.

from datetime import datetime 
from pytz import timezone 

fmt = "%Y-%m-%d %H:%M:%S" 

# Current time in UTC 
now_utc = datetime.now(timezone('UTC')) 
print now_utc.strftime(fmt) 

# Convert to US/Pacific time zone 
now_pacific = now_utc.astimezone(timezone('US/Pacific')) 
print now_pacific.strftime(fmt) 

# Convert to Europe/Berlin time zone 
now_berlin = now_pacific.astimezone(timezone('Europe/Berlin')) 
print now_berlin.strftime(fmt) 

Courtoisie: http://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

+0

Ceci est un exemple de la façon dont vous pouvez faire des conversions de fuseau horaire en Python pur, mais OpenERP a recommandé des façons de le faire et des directives indiquant quand cela a du sens (voir ma réponse) – odony

3

Au OpenERP 6.1 le fuseau horaire de toutes les opérations Python qui se passe sur le côté serveur (et modules) est forcé à être UTC. Ceci était une décision de conception expliquée dans divers endroits [1]. Le rendu des valeurs datetime dans le fuseau horaire de l'utilisateur est destiné à être effectué sur le client exclusivement.

Il y a très peu de cas où il est judicieux d'utiliser le fuseau horaire de l'utilisateur au lieu de l'UTC côté serveur, mais l'impression des valeurs datetime dans les rapports en fait partie, car le client n'aura aucune chance de convertir le contenu du rapport résultant. C'est pourquoi le moteur de rapport fournit une méthode utilitaire pour ce faire: la méthode formatLang() fournie dans le contexte des rapports (au moins ceux basés sur RML) formatera la date en fonction du fuseau horaire de l'utilisateur si vous appelez date_time=True (il utilise la variable de contexte tz passée dans les appels RPC et basée sur les préférences de fuseau horaire de l'utilisateur) Vous pouvez trouver un exemple de la façon dont cela est utilisé dans les addons officiels, par exemple dans le delivery module (l.171).

Jetez un oeil à la implementation de formatLang() si vous voulez savoir comment il fait réellement la conversion.

[1]: Voir le OpenERP 6.1 release notes, ce other question, ainsi que le commentaire 4 sur bug 918257 ou bug 925361.

+0

Thanks Odony. Je veux passer le fuseau horaire à mon rapport Jasper. Il ne passait pas correctement au serveur jasper. J'ai donc passé l'heure locale au rapport Jasper – OmaL

0

de: http://help.openerp.com/question/30906/how-to-get-users-timezone-for-python/

DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" 

import pytz 
from openerp import SUPERUSER_ID 

# get user's timezone 
user_pool = self.pool.get('res.users') 
user = user_pool.browse(cr, SUPERUSER_ID, uid) 
tz = pytz.timezone(user.context_tz) or pytz.utc 

# get localized dates 
localized_datetime = pytz.utc.localize(datetime.datetime.strptime(utc_datetime,DATETIME_FORMAT)).astimezone(tz) 
0

DateInUTC = < ~ variable dans le temps pour convertir

Pour convertir au fuseau horaire de l'utilisateur:

LocalizedDate = fields.datetime.context_timestamp(cr, uid, DateInUTC, context=context) 

Pour supprimer le décalage:

LocalizedDate = LocalizedDate.replace(tzinfo=None) 
Questions connexes