2012-11-20 15 views
6

W OpenERP, kiedy próbuję wydrukować bieżącą datę i godzinę, zawsze drukowany jest czas "UTC". Ale chcę znaleźć czas w strefie czasowej użytkownika. Każdy użytkownik ma inną strefę czasową. For example 'CST6CDT', "USA/Pacyfik" lub "Azja/Kalkuta". Muszę więc znaleźć czas w strefie czasowej użytkownika, aby móc pokazać poprawną datę i godzinę w raporcie. Próbowałem zmienić strefę czasową za pomocą funkcji localize() i replace() w module danych. Ale nie otrzymałem prawidłowego wyniku.Jak uzyskać lokalną strefę czasową użytkownika inną niż strefa czasowa serwera (UTC) w pythonie?

Odpowiedz

9

Mam to.

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) 

Dzięki uprzejmości http://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

+0

Jest to przykład tego, jak można wykonywać konwersje strefy czasowej w zwykłym Pythonie, ale OpenERP zalecił sposoby na zrobienie tego i wytyczne mówiąc, kiedy to ma sens (zobacz moją odpowiedź) – odony

3

Od OpenERP 6,1 strefa czasowa wszystkich operacji Pythona dzieje się na stronie serwera (aw modułów) jest zmuszony być UTC. To była decyzja projektowa wyjaśniona w różnych miejscach: [1]. Renderowanie wartości datetime w strefie czasowej użytkownika ma być wykonywane wyłącznie po stronie klienta.

Istnieje bardzo niewiele przypadków, w których sensowne jest używanie strefy czasowej użytkownika zamiast UTC na serwerze, ale w rzeczywistości drukowanie wartości datetime w raportach jest jednym z nich, ponieważ po stronie klienta nie będzie szansy na konwersję zawartość wynikowego raportu.

Dlatego mechanizm raportowania udostępnia metodę narzędzia: metoda formatLang() dostarczana w kontekście raportów (przynajmniej te oparte na RML) sformatuje datę zgodnie ze strefą czasową użytkownika, jeśli zadzwonisz to z wartością datetime iz date_time=True (używa zmiennej kontekstowej tz przekazywanej w wywołaniach RPC i na podstawie preferencji strefy czasowej użytkownika) Możesz znaleźć przykład użycia tego w oficjalnych dodatkach, na przykład w delivery module (l.171).

Spójrz na implementation z formatLang(), jeśli chcesz wiedzieć, jak to naprawdę robi konwersję.

[1]: Zobacz dokument OpenERP 6.1 release notes, ten other question, a także komentarz nr 4 na temat bug 918257 lub bug 925361.

+0

Dzięki Odony. Chcę przekazać strefę czasową do mojego raportu o jaspenie. Nie trafił on poprawnie do serwera jaspisów. W związku z tym przekazałem czas lokalny do raportu jaspisu – OmaL

0

od: 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 = < ~ Czas zmienna przekonwertować

Aby przekonwertować strefy czasowej użytkownika:

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

Aby usunąć offset:

LocalizedDate = LocalizedDate.replace(tzinfo=None) 
Powiązane problemy