OpenERP で、現在の日付と時刻を印刷しようとすると、常に「UTC」時刻が印刷されます。しかし、ユーザーの timezone で時間を取得したい。各ユーザーのタイムゾーンは異なります。For example 'CST6CDT'
、「米国/太平洋」または「アジア/カルカッタ」。したがって、レポートに正しい日時を表示できるように、ユーザーのタイムゾーンで時間を取得する必要があります。datatime モジュールの localize() および replace() 関数を使用してタイムゾーンを変更しようとしました。しかし、正しい出力が得られませんでした。
4 に答える
とった。
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/
OpenERP 6.1以降、サーバー側(およびモジュール内)で発生するすべてのPython操作のタイムゾーンはUTCに強制されます。これは、さまざまな場所で説明されている設計上の決定でした[1]。ユーザーのタイムゾーンでの日時値のレンダリングは、クライアント側でのみ実行されるようになっています。
サーバー側でUTCの代わりにユーザーのタイムゾーンを使用することが理にかなっている場合はほとんどありませんが、クライアント側ではコンテンツを変換する機会がないため、レポート内に日時値を出力することもその1つです。結果のレポート。
これが、レポートエンジンがそのためのユーティリティメソッドを提供する理由です。レポートformatLang()
のコンテキストで提供されるメソッド(少なくともRMLベースのメソッド)は、日時値を使用して呼び出すと、ユーザーのタイムゾーンに従って日付をフォーマットします。およびwith date_time=True
(tz
RPC呼び出しで渡され、ユーザーのタイムゾーン設定に基づくコンテキスト変数を使用します)これが公式アドオン、たとえば配信モジュール(l.171)でどのように使用されるかの例を見つけることができます。
実際に変換がどのように行われるかを知りたい場合は、の実装をご覧ください。formatLang()
[1]:OpenERP 6.1リリースノート、この他の質問、およびバグ918257またはバグ925361に関するコメント#4を参照してください。
DateInUTC = <~ 変換する時間変数
ユーザーのタイムゾーンに変換するには:
LocalizedDate = fields.datetime.context_timestamp(cr, uid, DateInUTC, context=context)
オフセットを削除するには:
LocalizedDate = LocalizedDate.replace(tzinfo=None)
から: 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)