跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 解决Odoo8.0单时区应用中的时区问题

解决Odoo8.0单时区应用中的时区问题

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
7 帖子 3 发布者 6.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • R 离线
    R 离线
    rogan
    写于 最后由 编辑
    #1

    由于数据库中存储的是UTC时区,默认情况下数据导出和group by都存在时区问题。
    解决办法:[b]将以UTC时区存储的数据改为按目标时区存储,并去掉JS中的时区转换[/b]。

    1、修改Odoo系统环境时区:
    odoo/openerp/init.py 文件
    import os
    os.environ['TZ'] = 'UTC' # 将这里的UTC 改为Asia/Shanghai 或其它目标时区

    2、修改 web页面时区转换的JS文件:
    odoo/addons/web/static/src/js/openerpframework.js 中的两个方法
    openerp.str_to_datetime  字符串转时间
    openerp.datetime_to_str  时间转字符串
    去掉这两个方法中的UTC字符。

    3、修改以UTC时间执行的SQL 查询或插入语句:
    去掉所有带 "at time zone 'UTC'" 或 "at time zone 'utc'"字符串的语句。
    odoo/openerp/models.py 特别是create_date、write_date字段值;
    odoo/openerp/addons/base/ir/ir_cron.py  定时任务中UTC时区改为当前时区;
    odoo/openerp/netsvc.py  备份下来的数据库名称时间标志

    4、修改其他功能性模块中带 "at time zone" 字符串来取UTC时间的语句。
    如 calendar 模块和 hr_timesheet_sheet模块

    1 条回复 最后回复
    0
    • wjfonhandW 离线
      wjfonhandW 离线
      wjfonhand
      写于 最后由 编辑
      #2

      1、写死成 Asia/Shanghai,这个只适合中国用户,此方案永远无法并入 odoo,只能留在openerp-china

      2、针对已有生产数据的情形,应用此方案前后会有一个数据差异,可能需要一个转换脚本

      Rogan 威武!

      GoodERP -- Odoo China fork

      1 条回复 最后回复
      0
      • R 离线
        R 离线
        rogan
        写于 最后由 编辑
        #3

        以上方案只适合一个时区的用户,能解决其时区问题。

        对于多时区,导出数据的时区问题解决方案是:[b]在导出时进行时区转换[/b]!
        class Datetime(Datetime):

            def convert_to_export(self, value, env):
                """ convert value from the cache to a valid value for export. The
                    parameter env is given for managing translations.
                """
                #将存储在数据库中的UTC时区的datetime字段转换成用户本机时区
                value_datetime = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
                current_timezone = env.context.get('tz', False)
                current_tz = pytz.timezone(current_timezone)
                utc_tz = pytz.timezone('UTC')
                utc_tz_datetime = utc_tz.localize(value_datetime, is_dst=None)
                value = utc_tz_datetime.astimezone(current_tz)

                if env.context.get('export_raw_data'):
                    return value
                return bool(value) and ustr(value)

        有解决多时区group by问题的大侠请不吝赐教!

        1 条回复 最后回复
        0
        • R 离线
          R 离线
          rogan
          写于 最后由 编辑
          #4

          [quote author=Jeff link=topic=17001.msg29995#msg29995 date=1422782945]
          1、写死成 Asia/Shanghai,这个只适合中国用户,此方案永远无法并入 odoo,只能留在openerp-china

          2、针对已有生产数据的情形,应用此方案前后会有一个数据差异,可能需要一个转换脚本

          Rogan 威武!
          [/quote]

          不求并入Odoo,只求国内单时区用户不再抱怨~ ;D
          已有数据的生产环境“请遵医嘱”。

          1 条回复 最后回复
          0
          • digitalsatoriD 离线
            digitalsatoriD 离线
            digitalsatori 管理员
            写于 最后由 编辑
            #5

            我不太喜欢你的彻底解决的方法和标题

            【上海先安科技】(tony AT openerp.cn)

            1 条回复 最后回复
            0
            • R 离线
              R 离线
              rogan
              写于 最后由 编辑
              #6

              [quote author=digitalsatori link=topic=17001.msg30005#msg30005 date=1422842528]
              我不太喜欢你的彻底解决的方法和标题
              [/quote]

              求大牛更好的方案啊。

              1 条回复 最后回复
              0

              • 登录

              • 没有帐号? 注册

              • 登录或注册以进行搜索。
              • 第一个帖子
                最后一个帖子
              0
              • 版块
              • 标签
              • 热门
              • 用户
              • 群组