日期格式化字符串: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对日期时间的操作的更多相关文章

  1. Oracle中日期时间的操作比较和加减-入门基础(转)

    Oracle关于时间/日期的操作     1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...

  2. JS对日期时间的操作

    代码: //判断是否超期(有效期开始超过一年后算已超期) function IsEffect(effectDate) { var val = ""; var currentDate ...

  3. [C++STDlib基础]关于日期时间的操作——C++标准库头文件<ctime>

    总结 /* A.头文件<ctime> #if _GLOBAL_USING && !defined(RC_INVOKED) _STD_BEGIN 1.四个数据类型 using ...

  4. Java中日期时间API小结

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

  5. 都9012了,Java8中的日期时间API你还没有掌握?

    一,Java8日期时间API产生的前因后果 1.1 为什么要重新定义一套日期时间API 操作不方便:java中最初的Date不能直接对指定字段进行加减操作也不支持国际化,后来新增了Calendar,但 ...

  6. 全面解析Java日期时间API

    时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间. UTC(Universal Time ...

  7. Java8 新特性(三) - 日期时间对象以及一些其他特性

    日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...

  8. paip.日期时间操作以及时间戳uapi php java python 总结

    paip.日期时间操作以及时间戳uapi php java python 总结 ///uapi Date 函数 | Day 函数 | Hour 函数 | Minute 函数 | Month 函数 | ...

  9. MySQL tips (日期时间操作/concat 等)

    1.  Query结尾要加一个分号: 2.  数据库和表 SHOW DATABASES;    USE YOUR_DB; SHOW TABLES; SHOW COLUMNS FROM study或者D ...

随机推荐

  1. 【windows socket+HTTPserverclient】

    Windows Socket+HTTPserverclient      Winsock是 Windows下套接字标准.                 1.HTTP协议:          HTTP ...

  2. Material Design(原质化设计)视觉设计语言规范 踏得网镜像

    Android 5.0 Lollipop(棒棒糖,也就是之前的代称Android L)全面实践了谷歌最新研发的 Material Design 设计语言规范,只是该设计规范并不是仅针对移动平台. 我们 ...

  3. 用最简单的例子理解适配器模式(Adapter Pattern)

    中国足球的水平虽然不高,但实际上,在每个城市会有一批足球爱好者,他们踢球.看球.懂球.有这样的2个足球爱好者,一个是左脚选手,另一个是右脚选手. public class PlayWithLeft { ...

  4. Xcode GDB 调试

    关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要 ...

  5. jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自己主动化(VSS、operamasks-UI框架)

    我的qq是2059055336,对这个课程有兴趣的能够加我qq联系. 一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景 jQuery 2.0 正式版公布.不在支持 IE 6/7/8  ...

  6. 【XJOI】【NOI考前模拟赛7】

    DP+卡常数+高精度/  计算几何+二分+判区间交/  凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……( ...

  7. 依赖注入 DI 控制反转 IOC MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. 理解JavaScript里this关键字

    1.全局代码中的this:始终指向window 2.函数代码中的this: }; var bar = { x: , test: function () { alert(this === bar); a ...

  9. IOS程式语法之block的使用掌握

    在现阶IOBlock 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容易了解,但是在iOS SDK 4.0之后,block几乎出现在所有新 ...

  10. Golang 中三种读取文件发放性能对比

    Golang 中读取文件大概有三种方法,分别为: 1. 通过原生态 io 包中的 read 方法进行读取 2. 通过 io/ioutil 包提供的 read 方法进行读取 3. 通过 bufio 包提 ...