Openerp对日期时间的操作
日期格式化字符串:DATE_FORMAT = "%Y-%m-%d"
日期时间格式字符串:DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
日期时间格式字符串(包含毫秒):DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S.%f"
OpenERP对象中字段赋值为当前日期(字符串):fields.date.context_today,fields.date.context_today(self, cr, uid, context=context),fields.date.today()
OpenERP对象中字段赋值为当前时间(字符串):fields.datetime.now(),fields.datetime.context_timestamp(cr, uid, datetime.now(), context=context)
OpenERP官方建议 date/datetime 的默认值的写法是:fields.date.context_today,fields.datetime.now()
字符串转换为日期时间:datetime.datetime.strptime(sale.date, DATE_FORMAT)
日期时间转换为字符串:datetime.datetime.strftime(datetime.date.today(), DATE_FORMAT)
python中获取当前日期:datetime.date.today()
python中获取当前时间:datetime.datetime.now()
OpenERP fields 单元中对 date/datetime 类中方法定义如下所示:
应用示例代码:
#自动获取日期对应的月份并保存
def _get_month(self, cr, uid, ids, field_name, arg, context=None):
res = {}
if context is None:
context = {}
DATETIME_FORMAT = "%Y-%m-%d"
for sale in self.browse(cr, uid, ids, context=context):
saledate = datetime.datetime.strptime(sale.date, DATETIME_FORMAT)
res[sale.id] = saledate.strftime('%Y') + '-' + saledate.strftime('%m')
return res
_columns={
'name':fields.char(u'单号', size=64, select=True, required=True, readonly=True),
'date':fields.date(u'日期', select=True, required=True, readonly=True),
'month':fields.function(_get_month, method=True, type='char', size=10, string = u'月份', store=True, invisible=True),
}
_defaults={
'name': lambda obj, cr, uid, context: '/',
'date':fields.date.context_today,
#'employee_id':_employee_get,
'state':'draft'
}
#自动计算到期日期,按开卡日期加 年数*365 天
def _get_due_date(self, cr, uid, ids, field_name, arg, context=None):
res = {}
if context is None:
context = {}
DATE_FORMAT = "%Y-%m-%d"
for rec in self.browse(cr, uid, ids, context=context):
category = rec.category
if category:
remaining_times=category.times_limit
if rec.active_date:
res[rec.id]=(datetime.datetime.strptime(rec.active_date, DATE_FORMAT) + datetime.timedelta(days=category.age_limit*365)).strftime(DATE_FORMAT)
else:
res[rec.id]=(datetime.date.today()+ datetime.timedelta(days=category.age_limit*365)).strftime(DATE_FORMAT)
return res
_columns={
"name":fields.char("卡号",size=64, required=True, readonly=True, states={'0':[('readonly',False)]}),
"category":fields.many2one("dispatch.service_card_category","服务卡类型", required=True, readonly=True, states={'0':[('readonly',False)]}),
'age_limit':fields.related('category', 'age_limit', string=u'年限', type='float', readonly=True, store=True),
"times_limit":fields.integer(u"初始次数", readonly=True),
"customer":fields.many2one("dispatch.customer","客户",required=True, select=True, readonly=True, states={'0':[('readonly',False)]}),
"remaining_times":fields.integer("剩余次数",required=True, readonly=True, states={'0':[('readonly',False)]}),
"active_date":fields.date("开卡日期",required=True, readonly=True, states={'0':[('readonly',False)]}),
'due_date':fields.function(_get_due_date, method=True, type='date', string = u'到期日期', store=True),
'state': fields.selection([('0', u'未开卡'),('1', u'已开卡'),('2', u'已用完'),('3', u'已过期'),('4', u'已锁定')], u'状态',required=True, readonly=True),
'lock_note': fields.char(u'锁定原因', size=200, invisible=False, readonly=True, states={'1':[('readonly',False)], '4':[('readonly',False)]}),
}
# TODO: can be improved using resource calendar method
#计算日期间隔对应的天数
def _get_number_of_days(self, date_from, date_to):
"""Returns a float equals to the timedelta between two dates given as string."""
DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
from_dt = datetime.datetime.strptime(date_from, DATETIME_FORMAT)
to_dt = datetime.datetime.strptime(date_to, DATETIME_FORMAT)
timedelta = to_dt - from_dt
diff_day = timedelta.days + float(timedelta.seconds) / 86400
return diff_day
#对象字段
_columns = {
'date_from': fields.datetime(u'起始日期',required=True, readonly=True, states={'draft':[('readonly',False)]}, select=True),
'date_to': fields.datetime(u'结束日期', readonly=True, states={'draft':[('readonly',False)]}),
'days': fields.float(u'天数', digits=(8, 2), readonly=True, states={'draft':[('readonly',False)]}),
}
#更改起始日期,自动计算请假天数
def onchange_date_from(self, cr, uid, ids, date_to, date_from):
"""
If there are no date set for date_to, automatically set one 8 hours later than
the date_from.
Also update the number_of_days.
"""
# date_to has to be greater than date_from
if (date_from and date_to) and (date_from > date_to):
raise osv.except_osv(_(u'警告!'),_(u'开始日期必须小于结束日期.'))
result = {'value': {}}
# No date_to set so far: automatically compute one 8 hours later
if date_from and not date_to:
date_to_with_delta = datetime.datetime.strptime(date_from, tools.DEFAULT_SERVER_DATETIME_FORMAT) + datetime.timedelta(hours=8)
result['value']['date_to'] = str(date_to_with_delta)
# Compute and update the number of days
if (date_to and date_from) and (date_from <= date_to):
diff_day = self._get_number_of_days(date_from, date_to)
result['value']['days'] = round(math.floor(diff_day))+1
else:
result['value']['days'] = 0
return result
#更改结束日期,自动计算请假天数
def onchange_date_to(self, cr, uid, ids, date_to, date_from):
"""
Update the number_of_days.
"""
# date_to has to be greater than date_from
if (date_from and date_to) and (date_from > date_to):
raise osv.except_osv(_(u'警告!'),_(u'开始日期必须小于结束日期.'))
result = {'value': {}}
# Compute and update the number of days
if (date_to and date_from) and (date_from <= date_to):
diff_day = self._get_number_of_days(date_from, date_to)
result['value']['days'] = round(math.floor(diff_day))+1
else:
result['value']['days'] = 0
return result
Openerp对日期时间的操作的更多相关文章
- Oracle中日期时间的操作比较和加减-入门基础(转)
Oracle关于时间/日期的操作 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...
- JS对日期时间的操作
代码: //判断是否超期(有效期开始超过一年后算已超期) function IsEffect(effectDate) { var val = ""; var currentDate ...
- [C++STDlib基础]关于日期时间的操作——C++标准库头文件<ctime>
总结 /* A.头文件<ctime> #if _GLOBAL_USING && !defined(RC_INVOKED) _STD_BEGIN 1.四个数据类型 using ...
- Java中日期时间API小结
Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...
- 都9012了,Java8中的日期时间API你还没有掌握?
一,Java8日期时间API产生的前因后果 1.1 为什么要重新定义一套日期时间API 操作不方便:java中最初的Date不能直接对指定字段进行加减操作也不支持国际化,后来新增了Calendar,但 ...
- 全面解析Java日期时间API
时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间. UTC(Universal Time ...
- Java8 新特性(三) - 日期时间对象以及一些其他特性
日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...
- paip.日期时间操作以及时间戳uapi php java python 总结
paip.日期时间操作以及时间戳uapi php java python 总结 ///uapi Date 函数 | Day 函数 | Hour 函数 | Minute 函数 | Month 函数 | ...
- MySQL tips (日期时间操作/concat 等)
1. Query结尾要加一个分号: 2. 数据库和表 SHOW DATABASES; USE YOUR_DB; SHOW TABLES; SHOW COLUMNS FROM study或者D ...
随机推荐
- LNMP 1.2升级Nginx、MySQL/MariaDB、PHP教程
一般情况下不建议对生产环境进行升级,升级开始后会停止LNMP相关服务.本文仅适用于LNMP1.2及以后版本! 在LNMP目前LNMP v1.2中已经包含了Nginx.MySQL/MariaDB.PHP ...
- solaris之cpu
一. Solaris的处理器硬件系统架构 Solaris支持多种处理器系统架构:SPARC.x86和x64.x64即AMD64及EMT64处理器.在版本2.5.1的时候,Solaris曾经一度被移植到 ...
- linux strace追踪mysql执行语句 (mysqld --debug)
转载请注明出处:使用strace追踪多个进程 http://www.ttlsa.com/html/1841.html http://blog.itpub.net/26250550/viewspace- ...
- MVC打印表格,把表格内容放到部分视图打印
假设在一个页面上有众多内容,而我们只想把该页面上的表格内容打印出来,window.print()方法会把整个页面的内容打印出来,如何做到只打印表格内容呢? 既然window.print()只会打印整页 ...
- Microsoft office2016打开很慢解决
(1)打开Excel(word.ppt也可以),进入空白纸张,或者随便打开或新建一个文件也行,然后点击左上角“文件”按钮,进入点击“选项”. (2)然后在“常规”选项里,拉到最下面,把“”这个选项去除 ...
- Java 内存释放
问题一什么叫垃圾回收机制 垃圾回收是一种动态存储管理技术它自动地释放不再被程序引用的对象按照特定的垃圾收集算法来实现资源自动回收的功能.当一个对象不再被引用的时候内存回收它占领的空间 ...
- Kali Linux下安装配置ProFTPD实例
1.安装ProFTPD 在ftp://ftp.proftpd.org/下能够找到官方公布的各个ProFTPD版本号,本人使用ftp://ftp.proftpd.org/historic/source/ ...
- MiniGUI ial 移植指南
MiniGUI ial 移植指南 2.1 ial的定义 ial是一个通用的抽象输入接口,可以输入统一的数据的结构,也就是说在MiniGUI的核心代码里输入的数据的格式是固定的,不管输入设备是鼠标 还是 ...
- 微信小程序Nginx环境配置
环境配置概述 主要内容: SSL免费证书申请步骤 Nginx HTTPS 配置 TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申 ...
- Java基础(十三):集合
一.Java 集合框架: 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组.虽然这些类都非常 ...