python日期的处理
来源:互联网 发布:ecshop nginx 伪静态 编辑:程序博客网 时间:2024/06/05 18:56
最近写了一个python项目,因为要处理时间区间timezone问题,又要处理按年,按月,按天,按班次出报表。所以花了相当多的时间来处理python的时间问题,觉得有必要写篇文章记录下来,以便日后使用.
1.dateutil.py
import pytzfrom datetime import datetime,timedeltadef second_interval(start, end): reverse = False if start > end: start, end = end, start reverse = True mydelta = (end.hour - start.hour)*60*60 + (end.minute - start.minute)*60 + end.second - start.second if reverse: mydelta = - mydelta return mydeltadef convert_datetime_timezone(dt, tz1, tz2): tz1 = pytz.timezone(tz1) tz2 = pytz.timezone(tz2) #dt = datetime.strptime(dt,"%Y-%m-%d %H:%M:%S") dt = tz1.localize(dt) dt = dt.astimezone(tz2) #dt = dt.strftime("%Y-%m-%d %H:%M:%S") return dtdef datetime_localize(dt, tz1): tz1 = pytz.timezone(tz1) dt = tz1.localize(dt) #dt = dt.strftime("%Y-%m-%d %H:%M:%S") return dtdef toUtcTime(localTime): utcTime=localTime.replace(tzinfo=(pytz.timezone("UTC"))) return utcTime def withTimeZone(strTimezone, time_native): myTime=time_native.replace(tzinfo=(pytz.timezone(strTimezone))) return myTimedef toLocalDate(strTimeZone, utcmoment_naive): utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc) localDatetime = utcmoment.astimezone(pytz.timezone(strTimeZone)) return localDatetimedef checkWorkShift(startTime,endTime,shift,plantCalendar,myNow): local_startTime=convert_datetime_timezone(startTime,"UTC",shift["time_zone"]) local_endTime=convert_datetime_timezone(endTime,"UTC",shift["time_zone"]) for calendarItem in plantCalendar: shift_date=calendarItem["shift_date"] item_startTime=shift_date item_endTime=shift_date+(endTime-startTime) local_item_startTime=convert_datetime_timezone(item_startTime,"UTC",shift["time_zone"]) local_item_endTime=convert_datetime_timezone(item_endTime,"UTC",shift["time_zone"]) if(local_item_startTime==local_startTime and local_item_endTime==local_endTime): if(calendarItem["working"]): return True else: return False localDate=local_startTime.date() working=isWorking(localDate.weekday(),shift) if(working): myNow2=datetime.utcnow() left=local_startTime+(endTime-startTime)+(myNow2-myNow)+(myNow-endTime) right=convert_datetime_timezone(myNow2,"UTC",shift["time_zone"]) if(left<=right): return True return Falsedef isWorking(weekday,shift): if(weekday==0): if(shift["monday"]): return True if(weekday==1): if(shift["tuesday"]): return True if(weekday==2): if(shift["wednesday"]): return True if(weekday==3): if(shift["thursday"]): return True if(weekday==4): if(shift["friday"]): return True if(weekday==5): if(shift["saturday"]): return True if(weekday==6): if(shift["sunday"]): return Truedef isSheduleShift(myDateTime,shift,scheduleweekdays): oneDay = timedelta(days=1) localDateTime=toLocalDate(shift["time_zone"],myDateTime) localDate=localDateTime.date() localDateStart=datetime.combine(localDate, datetime.min.time()) localDateEnd=localDateStart+oneDay startTime=toLocalDate(shift["time_zone"],datetime.combine(localDate,shift["from_time"])) endTime=toLocalDate(shift["time_zone"],datetime.combine(localDate, shift["to_time"])) localDateStart=toLocalDate(shift["time_zone"],localDateStart) localDateEnd=toLocalDate(shift["time_zone"],localDateEnd) if(startTime>=localDateStart and endTime<=localDateEnd): for wd in scheduleweekdays: if(localDate.weekday()==wd): return True return Falsedef getSheduleWeekdays(shift): scheduleweekdays=[]; if(shift["monday"]): scheduleweekdays.append(0) if(shift["tuesday"]): scheduleweekdays.append(1) if(shift["wednesday"]): scheduleweekdays.append(2) if(shift["thursday"]): scheduleweekdays.append(3) if(shift["friday"]): scheduleweekdays.append(4) if(shift["saturday"]): scheduleweekdays.append(5) if(shift["sunday"]): scheduleweekdays.append(6) return scheduleweekdays
2.业务代码
'''Created on Jun 28, 2017@author: Wilson.Ke'''from datetime import timedeltafrom oee_app.utils.dateutils import convert_datetime_timezonefrom oee_app.daos import lineoeeresultDaoclass Trend: def getTrend(self,viewBy,siteId,strtz,lineName,machineName,fromDate,toDate): datas=[] totalShiftTime=0 if(viewBy==1): hours=self.getHours(fromDate,toDate) for hour in hours: data={} h1=hour["start_time"].replace(tzinfo=None) h2=hour["end_time"].replace(tzinfo=None) lineData=lineoeeresultDao.getLineOEE(siteId, lineName, machineName,h1,h2) oee=0.0 schdowntime=0 for item in lineData: schdowntime=schdowntime+float(item["schdowntime"]) oee=oee+float(item["oee"]) data["schdowntime"]=schdowntime data["oee"]=oee data["name"]=str(hour["start_time"])+"~"+str(hour["end_time"]) data["shift_time"]=(h2-h1).total_seconds() data["calendar_time"]=data["shift_time"] data["nonschtime"]=0 datas.append(data) if(viewBy==2): days=self.getDays(fromDate,toDate) for day in days: data={} d1=day["start_time"].replace(tzinfo=None) d2=day["end_time"].replace(tzinfo=None) lineData=lineoeeresultDao.getLineOEE(siteId, lineName, machineName,d1,d2) #data=self.getTrendEachDay(siteId, lineName, machineName,d1,d2) oee=0.0; totalShiftTime=0.0 totalNoneSchedule=0.0 schdowntime=0.0 totalCalendarTime=0.0 for item in lineData: oee=oee+float(item["oee"])*float(item["shift_time"]) schdowntime=schdowntime+float(item["schdowntime"]) totalNoneSchedule=totalNoneSchedule+float(item["nonschtime"]) totalCalendarTime=totalCalendarTime+item["shift_time"] if item["working"]==1: totalShiftTime=totalShiftTime+item["shift_time"] if(totalShiftTime!=0): data["oee"]=oee/float(totalShiftTime); data["calendar_time"]=totalCalendarTime data["shift_time"]=totalShiftTime data["schdowntime"]=schdowntime day_start_time=convert_datetime_timezone(d1, "UTC", strtz) day_end_time=convert_datetime_timezone(d2, "UTC", strtz) data["name"]=day_start_time.strftime("%Y-%m-%d")+"~"+day_end_time.strftime("%Y-%m-%d") data["nonschtime"]=totalNoneSchedule datas.append(data) if(viewBy==3): weeks=self.getWeeks(fromDate,toDate) for week in weeks: data={} w1=week["start_time"].replace(tzinfo=None) w2=week["end_time"].replace(tzinfo=None) lineData=lineoeeresultDao.getLineOEE(siteId, lineName, machineName,w1,w2) week_start_time=convert_datetime_timezone(w1, "UTC", strtz) week_end_time=convert_datetime_timezone(w2, "UTC", strtz) data["name"]=week_start_time.strftime("%Y-%m-%d")+"~"+week_end_time.strftime("%Y-%m-%d") oee=0.0; totalShiftTime=0.0 totalNoneSchedule=0.0 schdowntime=0.0 totalCalendarTime=0.0 for item in lineData: oee=oee+item["oee"]*float(item["shift_time"]) schdowntime=schdowntime+float(item["schdowntime"]) totalNoneSchedule=totalNoneSchedule+float(item["nonschtime"]) totalCalendarTime=totalCalendarTime+item["shift_time"] if item["working"]==1: totalShiftTime=totalShiftTime+item["shift_time"] if(totalShiftTime!=0): data["oee"]=oee/totalShiftTime data["calendar_time"]=totalCalendarTime data["shift_time"]=totalShiftTime data["schdowntime"]=schdowntime data["nonschtime"]=totalNoneSchedule datas.append(data) if(viewBy==4): months=self.getMonths(strtz,fromDate,toDate) for month in months: data={} m1=month["start_time"].replace(tzinfo=None) m2=month["end_time"].replace(tzinfo=None) lineData=lineoeeresultDao.getLineOEE(siteId, lineName, machineName,m1,m2) data["name"]=month["curr_month"] oee=0.0; totalShiftTime=0.0 totalNoneSchedule=0.0 totalCalendarTime=0.0 schdowntime=0.0 for item in lineData: oee=float(oee)+float(item["oee"])*float(item["shift_time"]) schdowntime=schdowntime+float(item["schdowntime"]) totalNoneSchedule=totalNoneSchedule+float(item["nonschtime"]) totalCalendarTime=totalCalendarTime+item["shift_time"] if item["working"]==1: totalShiftTime=totalShiftTime+item["shift_time"] if(totalShiftTime!=0): data["oee"]=oee/totalShiftTime; data["calendar_time"]=totalCalendarTime data["shift_time"]=totalShiftTime data["schdowntime"]=schdowntime data["nonschtime"]=totalNoneSchedule datas.append(data) return self.processData(datas,fromDate,toDate) def processData(self,datas,fromDate,toDate): items=[] for data in datas: item={}# calendarTime=(toDate-fromDate).total_seconds() shiftTime=data["shift_time"] if shiftTime==0: item["name"]=data["name"] item["oee"]=0.0 item["teep"]=0.0 else: calendarTime=data["calendar_time"] planedProductionTime=calendarTime-data["schdowntime"] item["name"]=data["name"] oee=data["oee"] loading=(planedProductionTime-data["nonschtime"])/calendarTime teep=float(loading)*float(oee) item["oee"]=round(oee*100,1) item["teep"]=round(teep*100,1) items.append(item) return items def getTrendEachHour(self,siteId, lineName, machineName,startTime,endTime): data=lineoeeresultDao.getOEETrend(siteId, lineName, machineName, startTime, endTime) return data def getTrendEachDay(self,siteId, lineName, machineName,startTime,endTime): data=lineoeeresultDao.getOEETrend(siteId, lineName, machineName, startTime, endTime) return data def getTrendEachWeek(self,siteId, lineName, machineName,startTime,endTime): data=lineoeeresultDao.getOEETrend(siteId, lineName, machineName, startTime, endTime) return data def getTrendEachMonth(self,siteId, lineName, machineName,startTime,endTime): data=lineoeeresultDao.getOEETrend(siteId, lineName, machineName, startTime, endTime) return data def getHours(self,startTime,endTime): arrHour=[] oneHour = timedelta(hours=1) while startTime<endTime: currTime = startTime +oneHour myHour={} myHour["start_time"]=startTime myHour["end_time"]=currTime arrHour.append(myHour) startTime=currTime if(endTime>startTime): myHour={} myHour["start_time"]=startTime myHour["end_time"]=endTime arrHour.append(myHour) return arrHour def getDays(self,startTime,endTime): arrDay=[] oneDay = timedelta(days=1) while startTime<endTime: myDay={} myDay["start_time"]=startTime startTime = startTime +oneDay myDay["end_time"]=startTime arrDay.append(myDay) return arrDay def getWeeks(self,startTime,endTime): arrWeek=[] oneDay = timedelta(days=1) weekStart=startTime while startTime<endTime: if(startTime.weekday()==4): myWeek={} myWeek["start_time"]=weekStart myWeek["end_time"]=startTime+oneDay arrWeek.append(myWeek) weekStart=myWeek["end_time"] startTime= startTime +oneDay if(endTime>weekStart): myWeek={} myWeek["start_time"]=weekStart myWeek["end_time"]=endTime arrWeek.append(myWeek) return arrWeek def getMonths(self,strtz,startTime,endTime): oneDay = timedelta(days=1) arrMonth=[] monthStart=startTime while startTime<endTime: d1=monthStart.replace(tzinfo=None) localMonthStart=convert_datetime_timezone(d1, "UTC", strtz) d2=startTime.replace(tzinfo=None) localStart=convert_datetime_timezone(d2, "UTC", strtz) if(localMonthStart.month!=localStart.month): myMonth={} myMonth["curr_month"]=str(localMonthStart.year)+"-"+str(localMonthStart.month) myMonth["start_time"]=monthStart myMonth["end_time"]=startTime arrMonth.append(myMonth) monthStart=startTime startTime=startTime+oneDay d1=monthStart.replace(tzinfo=None) localMonthStart=convert_datetime_timezone(d1, "UTC", strtz) d2=startTime.replace(tzinfo=None) localStart=convert_datetime_timezone(d2, "UTC", strtz) if(endTime>=startTime and monthStart.month!=localStart.month): myMonth={} myMonth["curr_month"]=str(startTime.year)+"-"+str(startTime.month) myMonth["start_time"]=monthStart myMonth["end_time"]=endTime arrMonth.append(myMonth) return arrMonth
阅读全文
0 0
- python的日期处理
- python日期的处理
- 超实用的python日期处理笔记
- Python日期处理
- python 日期处理
- Python日期处理
- python之日期处理
- Python处理日期坐标轴
- python日期处理
- Python 日期处理
- python 日期时间处理
- Python的时间、日期和时间戳的处理办法
- python datetime 常用的几种处理日期的方式
- python的一些日期处理方法(工具)
- python-pandas 时间日期的处理(下篇)
- python 时间日期处理汇集
- Python日期各种处理方式
- python datetime 时间日期处理
- 安卓开发必看网站
- css布局------各种居中
- 笔记,传统乘法器
- 内存地址的计算方法
- 利用.bat文件清除Keil编译生成的无用文件
- python日期的处理
- 回炉重造之设计模式——单例模式(Java)
- PHP内核探索:新垃圾回收机制说明
- 字节序(byte order)和位序(bit order)
- secure CRT key可用
- 关于Easyui region 设置高度和宽度
- linux下的文件名和路径的长度限制
- 数据库优化——选择合适的字段类型
- O'Reilly人工智能大会将于2018年4月10-13日来到北京:讲师征集开始