在Python中,与时间处理有关的模块就包括:time,datetime以及calendar。
time模块提供各种操作时间的函数
datetime模块定义了下面这几个类:
python中处理的事件类型有哪几种呢?
Python中,通常有以下方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。
(1) 时间戳的方式:时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,时间戳是惟一的,如:1382678303.098。运行“type(time.time())”,返回的是float类型。返回时间戳方式的函数主要有time(),clock()等。
(2) 格式化的时间字符串,返回字符串的函数主要有 time.strftime('%Y-%m-%d')
(3) 元组(struct_time):struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。同一个时间戳的struct_time会因为时区不同而不同。下面列出这种方式元组中的几个元素:
索引 属性 值
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0 表示周日)
7 tm_yday(一年中的第几天) 1 - 365
8 tm_isdst(是否是夏令时) 默认为-1,(-1, 0 or 1) 0:普通 1:DST夏令时比正常的早一个小时 -1:根据当前时区
为了从实用的角度出发就不把time和datetime分开了,从获取和输出的角度来整理下:
1. 如何获得时间,如何获得各种格式的时间?
time模块:
>>> import time >>> time.time()#获得当前时间的时间戳 1382679270.196 >>> time.clock()#第一次运行获得当前时间的时间戳,第二次运行就是间隔上一次运行的时间间隔 2.1380998706449576e-06 >>> time.mktime((2013,11,11,11,11,11,1,1,0))#利用mktime函数创建一个时间戳 1384139471.0
datetime模块:
>>> from datetime import * >>> date.today()*获取今天的日期 datetime.date(2013, 10, 25) >>> datetime.today()#获取今天的日期和时间 datetime.datetime(2013, 10, 25, 13, 42, 53, 455000) >>> datetime.now()#获取当前的日期和时间 datetime.datetime(2013, 10, 25, 13, 43, 0, 322000)
2. 有了时间后,再实际中会设计到格式之间的处理,比如数据库中一般会保存时间戳格式的,而现实的时候应该是字符串了吧,那个struct_time,好吧,用的比较少吧?
time模块:
时间戳-->struct_time,字符串
>>> import time >>> a = time.time()#获取当前时间的时间戳 >>> a 1382680272.862 >>> time.ctime(a)*将时间戳转换为时间字符串 'Fri Oct 25 13:51:12 2013' >>> time.gmtime(a)#将时间转换为struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=5, tm_min=51, tm_sec=12, tm_wday=4, tm_yday=298, tm_isdst=0) >>> time.localtime()#将当前时间转换为struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=52, tm_sec=1, tm_wday=4, tm_yday=298, tm_isdst=0) >>> time.localtime(a)#将a转换为struct_time time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=51, tm_sec=12, tm_wday=4, tm_yday=298, tm_isdst=0)
struct_time-->字符串,时间戳
>>> import time >>> a = time.localtime() >>> a time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=13, tm_min=57, tm_sec=18, tm_wday=4, tm_yday=298, tm_isdst=0) >>> b = time.asctime(a)#转换为字符串 >>> b 'Fri Oct 25 13:57:18 2013' >>> time.mktime(a)#转换为时间戳 1382680638.0 >>> time.strftime("%a %b %d %H:%M:%S %Y",a)#转换为字符串 'Fri Oct 25 13:57:18 2013'
字符串-->struct_time,PS:字符串不能直接转换为时间戳,需要先转为struct_time
>>> import time >>> a time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=14, tm_min=5, tm_sec=28, tm_wday=4, tm_yday=298, tm_isdst=0) >>> b = time.asctime(a) >>> b 'Fri Oct 25 14:05:28 2013' >>> c = time.strptime(b,'%a %b %d %H:%M:%S %Y')#按照格式转换为9元组 >>> c time.struct_time(tm_year=2013, tm_mon=10, tm_mday=25, tm_hour=14, tm_min=5, tm_sec=28, tm_wday=4, tm_yday=298, tm_isdst=-1)
datetime模块:
介绍几个datetime模块常用的方法:
datetime.fromtimestamp(time.time())#将时间戳转换为字符串
from datetime import * import time print 'datetime.max:', datetime.max print 'datetime.min:', datetime.min print 'datetime.resolution:', datetime.resolution print 'today():', datetime.today() print 'now():', datetime.now() print 'utcnow():', datetime.utcnow() print 'fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time())#将时间戳转换为字符串 print 'utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()) # ---- 结果 ---- # datetime.max: 9999-12-31 23:59:59.999999 # datetime.min: 0001-01-01 00:00:00 # datetime.resolution: 0:00:00.000001 # today(): 2010-04-07 09:48:16.234000 # now(): 2010-04-07 09:48:16.234000 # utcnow(): 2010-04-07 01:48:16.234000 # 中国位于+8时间,与本地时间相差8 # fromtimestamp(tmstmp): 2010-04-07 09:48:16.234000 # utcfromtimestamp(tmstmp): 2010-04-07 01:48:16.234000
3. 处理一些特殊的情况,比如需要设定某个时间的间距的时候,用到datetime的datetime.timedelta类。
见代码:
#! /usr/bin/python # coding=utf-8 from datetime import datetime,timedelta """ timedelta代表两个datetime之间的时间差 """ now = datetime.now() past = past = datetime(2010,11,12,13,14,15,16) timespan = now - past #这会得到一个负数 past - now attrs = [ ("days","日"),( 'seconds',"秒"),( 'microseconds',"毫秒") #('min',"最小"),( 'max',"最大"), ] for k,v in attrs: "timespan.%s = %s #%s" % (k,getattr(timespan, k),v) """ 总共相差的秒数 """ timespan.total_seconds() """ 实例化一个timespan 请注意它的参数顺序 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) """ timespan = timedelta(days=1)##timespan = timedelta(minutes=30) now - timespan #返回的是datetime型 now + timespan timespan * 2 #还可以乘哦。代表二倍 timespan / 13 #增加一个月 from calendar import monthrange now + timedelta(days=monthrange(start.year,start.month)[1])
最后列出格式化字符串中的意义:
%a 星期的简写。如 星期三为Web
%A 星期的全写。如 星期三为Wednesday
%b 月份的简写。如4月份为Apr
%B月份的全写。如4月份为April
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
%d: 日在这个月中的天数(是这个月的第几天)
%f: 微秒(范围[0,999999])
%H: 小时(24小时制,[0, 23])
%I: 小时(12小时制,[0, 11])
%j: 日在年中的天数 [001,366](是当年的第几天)
%m: 月份([01,12])
%M: 分钟([00,59])
%p: AM或者PM
%S: 秒(范围为[00,61],为什么不是[00, 59],参考python手册~_~)
%U: 周在当年的周数当年的第几周),星期天作为周的第一天
%w: 今天在这周的天数,范围为[0, 6],6表示星期天
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x: 日期字符串(如:04/07/10)
%X: 时间字符串(如:10:43:39)
%y: 2个数字表示的年份
%Y: 4个数字表示的年份
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z: 时区名称(如果是本地时间,返回空字符串)
%%: %% => %