第4天:
遇到的问题:
发现了一个Python获取当前时间和其时区问题:
在odoo中插入数据库的记录中的时间对象都和我们东八区有8个时间的误差,后来才发现,在odoo10/start.py中定义了时间区间是UTC
__import__('os').environ['TZ'] = 'UTC'
那么如何修改成东八区呢?
我以为修改成”Asia/Shanghai”就可以,但是发现数据库记录中仍然是与我的时区相差八个小时,那么肯定还有其他地方是需要更多的修改,参考博客:
http://www.oschina.net/question/5189_3943
在尽量不修改odoo源代码的前提下,我就先不进行修改了,那么就自己手动解决时区问题:
在我们进行时间比较时,手动转化成时间戳模式,再进行比较
那么如果我们要进行提取数据库中的时间项呢,那肯定要进行转换成+8个小时之后的
Python中2个格式化时间的比较
解决方法(时间对象和时间戳的相互转换)参考链接:
http://blog.csdn.net/google19890102/article/details/51355282
实现转换如下: UTC时间对象——>时间戳——> + 8个时间——>转换成时间对象:
#从数据中取出时间对象,转化成时间戳,再加8小时
time_start_val = time.mktime(time.strptime(obj.time_start, "%Y-%m-%d %H:%M:%S")) + 8 * 60 * 60
# 将数据库中的时间对象对应的时间戳转换回格式化字符串
# 1,首先转换成localtime
time_start_local_val = time.localtime(time_start_val)
# 2.#转换成新的时间格式(比如2016-05-05 20:28:54)
true_time_start = time.strftime("%Y-%m-%d %H:%M:%S",time_start_local_val)
这样就完成了转化
在odoo平台开发中,我负责的是后端逻辑的编写,但是对写什么,怎么写,毫无头绪——感觉自己什么都不了解啊。后来根据我的了解到就是,一个项目下的其中2歌文件夹,分别是controllers和templates,文件目录如图所示:
当我们打开templates中的页面时,controllers中的main.py会根据你所打开的页面根据路由信息调用对应的函数,返回相应的数据给前端——这是我目前了解到的套路,这可能跟jinja这个模版引擎有关(促使前后端分离),那么这个我们需要进行进一步的深入学习。可以先说说我的一个前端页面代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <ul> {% for item in data %} <!-- json数组 --> <li>课程名字:{{item.course}}-老师:{{item.teacher}}-时间是-{{item.time_start}}到{{item.time_end}}--描述:{{item.description}}-</li> {% endfor %} </ul> </body> </html>
里面嵌套着一些jinja语法,那么data这个数据是从哪里来的呢,是在controllers/main.py中的MainController类中的一个函数:
@http.route('/ws_training/index', type='http', auth='public', csrf=False) def index(self, **kwargs): #-------------找到最近的课程--------------# course_model = http.request.env['ws.training.course'] #request对象其实是 course_list = course_model.sudo().search([]) #根据搜索条件得到记录 #if 判断到学生登陆了: 学生id 为 student_id data_list = [] # 格式化成2016-03-20 11:45:39形式 #ourTimeZone = pytz.timezone('Asia/Shanghai') currentTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) for obj in course_list: # 遍历list中的对象,每个对象其实是这个表中的一条记录 print "该条课程记录的课程开始时间是:",obj.time_start # 将格式字符串转换为时间戳,时间间隔是以秒为单位的浮点小数 print currentTime currentTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) currentTimeVal = time.mktime(time.strptime(currentTime, "%Y-%m-%d %H:%M:%S")) time_start_val = time.mktime(time.strptime(obj.time_start, "%Y-%m-%d %H:%M:%S")) + 8 * 60 * 60 time_end_val = time.mktime(time.strptime(obj.time_end, "%Y-%m-%d %H:%M:%S")) + 8 * 60 * 60 # 将数据库中的时间对应的时间戳转换回格式化字符串 # 1,首先转换成localtime time_start_local_val = time.localtime(time_start_val) time_end_local_val = time.localtime(time_end_val) # 2.#转换成新的时间格式(2016-05-05 20:28:54) true_time_start = time.strftime("%Y-%m-%d %H:%M:%S",time_start_local_val) true_time_end = time.strftime("%Y-%m-%d %H:%M:%S",time_end_local_val) if time_start_val >= currentTimeVal: #上课时间大于当前时间,签到是合法的 ——————简单模版 data_list.append({'teacher': obj.teacher_id.name, 'course': obj.name, 'time_start': true_time_start, 'time_end': true_time_end, 'description': obj.description, }) # print data_list template = env.get_template("index.html") return template.render(data=data_list) #---------------作者:...——————————————————————————#
其主要功能是访问了数据库,然后通过一些逻辑处理之后得到数据,以列表的形式返回给前端。更多的了解可能需要jinja的深入了解了,未来有机会会继续深入学习。
而且,这个类也有一些特殊的性质:
class MainController(http.Controller): #Controller继承于object,它就定义了一个元类:ControllerType,目的:控制类的创建行为 #metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。 #元类会删除掉类中的所有类属性,目的就是避免造成混淆