2012-11-20 30 views
6

In OpenERP, quando provo a stampare la data e l'ora correnti, stampa sempre l'ora 'UTC'. Ma voglio avere tempo nel fuso orario dell'utente. Ogni utente ha un fuso orario diverso. For example 'CST6CDT', "USA/Pacifico" o "Asia/Calcutta". Quindi ho bisogno di ottenere il fuso orario dell'utente in modo che possa mostrare il datetime corretto nel rapporto. Ho provato a cambiare il fuso orario usando la funzione localize() e replace() nel modulo datatime. Ma non ho ottenuto l'output corretto.Come ottenere il fuso orario locale dell'utente diverso dal fuso orario del server (UTC) in python?

risposta

9

Capito.

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) 

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

+0

Questo è un esempio di come potresti fare le conversioni del fuso orario in Python normale, ma OpenERP ha raccomandato modi per farlo e le linee guida dicono quando ha senso (vedi la mia risposta) – odony

3

partire OpenERP 6.1 fuso orario di tutte le operazioni di Python che accadono sul lato server (e in moduli) è costretto a essere UTC. Questa è stata una decisione di progettazione spiegata in vari punti [1]. Il rendering dei valori datetime nel fuso orario dell'utente è pensato per essere eseguito esclusivamente sul lato client.

Ci sono pochissimi casi in cui ha senso usare il fuso orario dell'utente invece di UTC sul lato server, ma in effetti la stampa di valori datetime all'interno dei report è uno di questi, perché il lato client non avrà possibilità di convertire il contenuto del rapporto risultante.

Ecco perché il motore di report fornisce un metodo di utilità per farlo: il metodo formatLang() fornito nel contesto dei report (almeno quelli basati su RML) formatta la data in base al fuso orario dell'utente se si chiama con un valore datetime e con date_time=True (utilizza la variabile di contesto tz trasmessa nelle chiamate RPC e in base alle preferenze del fuso orario dell'utente) È possibile trovare un esempio di come questo viene utilizzato nei componenti aggiuntivi ufficiali, ad esempio nello delivery module (l.171).

Dai uno sguardo allo implementation di formatLang() se vuoi sapere come funziona la conversione.

[1]: vedere l'OpenERP 6.1 release notes, questo other question, nonché il commento n. 4 su bug 918257 o bug 925361.

+0

Grazie Odony. Voglio passare il fuso orario al mio rapporto Jasper. Non stava passando correttamente al server jasper. Così ho passato l'ora locale al rapporto di Jasper – OmaL

0

da: 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 = < ~ Tempo variabile per convertire

Per convertire in fuso orario dell'utente:

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

Per rimuovere l'offset:

LocalizedDate = LocalizedDate.replace(tzinfo=None)