2012-11-20 10 views
6

OpenERPでは、現在の日付と時刻を印刷しようとすると、常に 'UTC'時間が表示されます。しかし、私はユーザーのタイムゾーンで時間を取得したい。各ユーザーのタイムゾーンは異なります。 For example 'CST6CDT'、 '米国/太平洋'または 'アジア/カルカッタ'。だから私は、レポートに正しい日時を表示できるように、ユーザーのタイムゾーンで時間を取得する必要があります。私は、datatimeモジュールでlocalize()とreplace()関数を使用してタイムゾーンを変更しようとしました。しかし、私は正しい出力を得ていませんでした。Pythonでサーバーのタイムゾーン(UTC)以外のユーザーのローカルタイムゾーンを取得する方法は?

答えて

9

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) 

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

+0

これはプレーンなPythonでタイムゾーン変換を行う方法の例ですが、OpenERPはこれを行う方法とそれが意味をなされたときのガイドラインをお勧めしています(私の答えを参照) – odony

3

OpenERP 6.1サーバー側で起こっ全てのPythonの操作のタイムゾーンのとおり(とモジュールに)UTCことを余儀なくされています。これは、さまざまな場所で説明された設計の決定でした[1]。ユーザーのタイムゾーンでの日時値のレンダリングは、クライアント側で排他的に行われることを意味します。

サーバー側でUTCではなくユーザーのタイムゾーンを使用するのは意味があるケースはほとんどありませんが、クライアント側で変換する機会がないため、結果のレポートの内容。

レポートエンジンでは、レポートのコンテキストで提供されているformatLang()メソッド(RMLベースの方法以上)を使用すると、ユーザーがコールするとユーザーのタイムゾーンに従って日付がフォーマットされますそれはdatetime値とdate_time=True(RPC呼び出しで渡され、ユーザーのタイムゾーン設定に基づいてtzコンテキスト変数を使用します) これは公式アドオンでどのように使用されているかの例を見つけることができます。たとえば、delivery module (l.171)です。

implementationformatLang()です。変換の実際の仕組みを知りたい場合は、implementationをご覧ください。

[1]:OpenERP 6.1 release notesother question、およびbug 918257またはbug 925361のコメント#4を参照してください。

+0

Thanks Odony。ジャスパーレポートにタイムゾーンを渡したい。ジャスパーサーバーに正しく渡されませんでした。だから私は地元の時間をジャスパー報告書に渡した – OmaL

0

から: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ユーザーのタイムゾーンに変換するには

を変換する= <〜時間変数:

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

オフセットを削除するには:

LocalizedDate = LocalizedDate.replace(tzinfo=None) 
関連する問題