2017-04-10 3 views
0

でタイムゾーン、および新しい日時フィールドに入れた結果、2時間を得る必要以上CONCATENATE日付と時刻フィールドの後odoo 9

例:

date = fields.Date(string = 'date', select=True) 
time = fields.Many2one('period.time', string='Available time',select=True) 
date_time = fields.Datetime(string='Datetime', compute="_compute") 
description = fields.Char(string = 'Descroption', compute="_compute") 

@api.onchange('date', 'time') #time is 08:00:00 
def _compute(self): 
    self.date_time = "%s %s:00" % (self.date,self.time.name) 
    self.description = "%s %s:00" % (self.date,self.time.name) 

DATE_TIME(日時)2017年4月10日10 :00:00 - >間違っ

説明(シャア)2017年4月10日午前8時00分○○秒 - >正しい

どのようにこの問題を解決しますか?

+0

odooにはどのタイプのフィールドがありますか? –

+0

@ EmiproTechnologiesPvt.Ltd。時間はMany2one –

+0

フィールドの完全なコードを書くことができますか? –

答えて

1

これはodoo側からは間違っていません。なぜなら、odooはUTCに日付を保存するからです。ユーザーが日付を要求すると、odooはデータベースの日付をユーザーのタイムゾーンに変換します。あなたがデータベースに行けば

ので、あなたはとても日付メイクを保存する前にフィールドがdate = 2017-04-10 08:00:00を格納しているが、ビューで日付が2017-04-10 10:00:00

に変換されて、あなたのケースで、ユーザーのタイムゾーンに変換されていることがわかります 私はそれがidはそれを使用しなかった仕事を望むが、私はいずれかが存在する場合、それが動作すると思い、これを試してください:あなたはDATE_TIMEに2017-04-10 08:00:00を保存して、2017-04-10 06:00:00

編集を保存していない私が意味UTC日時に値を変換していることを確認してくださいエラーはここに入力してください:

01あなたはクラス日時ための方法を見つけることができますodooクラスのdatetimeで
# first import 
from datetime import datetime 
import pytz 

class ... 
    ... 
    date = fields.Date(string = 'date', select=True) 
    time = fields.Many2one('period.time', string='Available time',select=True) 
    date_time = fields.Datetime(string='Datetime', compute="_compute") 
    description = fields.Char(string = 'Descroption', compute="_compute") 
    ... 
    ... 

    @api.onchange('date', 'time') #time is 08:00:00 
    def _compute(self): 
     # by default timezone = UTC 
     user_time_zone = pytz.UTC 

     if self.env.user.partner_id.tz : 
      # change the timezone to the timezone of the user 
      user_time_zone = pytz.timezone(self.env.user.partner_id.tz) 

     # create time string 
     concat_time = "%s %s:00" % (self.date,self.time.name) 
     fmt = '%Y-%m-%d %H:%M:%S' 

     # create a time object 
     user_time = datetime.strptime(concat_time, fmt) 

     # define the timezone of the time object 
     # here i think the first line is enougth 
     user_time = user_time_zone.localize(user_time) 
     user_time.replace(tzinfo=user_time_zone) 

     # you can get the time in UTC like this 
     print "This is what you need to save in database %s ", user_time.astimezone(pytz.UTC).strftime(fmt) 

     self.date_time = user_time.astimezone(pytz.UTC).strftime(fmt) 
+0

はいデータベースが正しい日時になっています....表示が間違っています –

+0

私の回答が編集されました – Cherif

+0

コードを試しました – Cherif

0

def context_timestamp(record, timestamp): 

あなたは、このようなユーザのタイムスタンプにUTCであなたに日時を変換するために、このメソッドを使用することができます。

あなたはこの2つのパッケージ

import datetime as DT 
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DF 

をインポートし、これを実行した後に必要になります。

date = fields.Date(string = 'date', select=True) 
time = fields.Many2one('period.time', string='Available time',select=True) 
date_time = fields.Datetime(string='Datetime', compute="_compute") 
description = fields.Char(string = 'Descroption', compute="_compute") 

@api.onchange('date', 'time') #time is 08:00:00 
def _compute(self): 
     date_utc = DT.datetime.strptime(self.date, DF) 
     date_tz = fields.Datetime.context_timestamp(self, date_utc) 
     self.description = date_tz.strftime(DF) 
関連する問題