datetime模块
将最近收集到的datetime模块的用法进行了一些梳理,其中一些内容参考了廖雪峰及指尖跳动的精灵的博客,时不时会更新。
datetime模块常用的有datetime(日期时间),date(日期),time(时间),timedelta(时间范围),timezone(时区)这几个类。
datetime类
datetime模块中含有datetime类,导入时注意。
创建
from datetime import datetime
dt = datetime(2016,12,25,18,28,32) #创建2016年12月25日18点28分32秒的datetime
datetime转为timestamp
ts = dt.timestamp()
timestamp转为datetime
dt = datetime.fromtimestamp(ts[, tz]) #本地时间,参数tz指定时区信息
dt_utc = datetime.utcfromtimestamp(ts) #UTC时间
datetime转为str
strdt = dt.strftime('%a %b,%Y-%m-%d %H:%M:%S')
str转为datetime
dt = datetime.strptime('2016-12-25 18:28:32', '%Y-%m-%d %H:%M:%S')
其中括号里的字符串代表想要转成的格式
格式表:(注意大小写)
符号 | 含义 | 样式 |
---|---|---|
%Y | 年 | 2016 |
%m | 月 | 12 |
%d | 日(在月中) | 25 |
%a | 周(英文简写) | Mon |
%A | 周(英文全写) | Monday |
%b | 月(英文简写) | Dec |
%B | 月(英文全写) | December |
%H | 时(24) | 18 |
%p | AM或者PM | PM |
%I | 时(12) | 6 |
%M | 分 | 28 |
%S | 秒 | 32 |
%f | 微秒 | 4321 |
其他:
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
%j: 日在年中的天数 [001,366](是当年的第几天)
%U: 周在当年的周数当年的第几周),星期天作为周的第一天
%w: 今天在这周的天数,范围为[0, 6],6表示星期天
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x: 日期字符串(如:04/07/10)
%X: 时间字符串(如:10:43:39)
%y: 2个数字表示的年份
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z: 时区名称(如果是本地时间,返回空字符串)
datetime加减
注意:加减需要导入timedelta这个类
from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
时区问题
datetime有时区,默认为当前系统时区。timestamp没有时区概念
本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:
2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:
2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:
2015-04-19 04:20:00 UTC+0:00
一个datetime类型有一个时区属性tzinfo,但是默认为None,无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区。
>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
时区转换
我们可以先通过utcnow()拿到当前的UTC时间,再转换为任意时区的时间:
# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00
# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00
# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00
时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。
利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。
注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime都可以正确转换,例如上述bj_dt到tokyo_dt的转换。
其他属性方法
dt.year dt.month dt.day dt.hour .... #返回年,月,日,时等,类型为整数
datetime.today() #返回一个表示当前本地时间的datetime对象
datetime.now([tz]) #返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间
datetime.utcnow() #返回一个当前utc时间的datetime对象
datetime.combine(date, time) #根据date和time,创建一个datetime对象
datetime.date() #获取date对象
datetime.time() #获取time对象
datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) #替换,返回新datetime对象,原datetime不变
datetime.weekday() #返回datetime的星期,周一返回0,周二返回1,。。。
datetime.isoweekday() #返回datetime的星期,周一返回1,周二返回2,。。。
datetime.isocalendar() #返回(年,周数,星期)的元组
datetime.isoformat() #返回'YYYY-MM-DDTHH:MM:SS.mmmmmm'的字符串
date类
创建
import datetime
#创建2016年12月26日的date类型
d = datetime.date(2016,12,26)
#年的范围1~9999
#月的范围1~12 注意不要写0
#日的范围根据月定 注意不要写0
timestamp转为date
#参数位时间戳,返回一个date 类
d = datetime.date.fromtimestamp(timestamp)
date转为str
s = d.strftime(%Y-%m-%d)
#字符串格式如datetime类中所述
date加减,比较
注意:加减需要导入timedelta这个类
date1 > date2
date1 = date2 + timedelta
timedelat = date1 - date2
其他属性方法
datetime.date.today() #返回当前日期
d.year d.month d.day #返回date的年,月,日,类型为整数
d.replace(day=25) #用新的年,月,日替换,返回替换后的新date,不改变原date
d.weekday() #返回date的星期,周一返回0,周二返回1,。。。
d.isoweekday() #返回date的星期,周一返回1,周二返回2,。。。
d.ioscalendar() #返回(年,周数,星期)的元组
d.isoformat() #返回'YYYY-MM-DD'的字符串
time类
注意:time类也有时区的概念
创建
import datetime
#创建15点32分25秒4321微秒的time类型
t = datetime.time(15,32,25,4321)
#hour的范围为[0, 24)
#minute的范围为[0, 60)
#second的范围为[0, 60)
#microsecond的范围为[0, 1000000)
#还可加一个tzinfo的时区参数
time转化str
s = t.strftime(%H:%M:%S)
#字符串格式如datetime类中所述
其他属性方法
t.hour t.minute t.second t.microsecond #返回time的时、分、秒、微秒,类型为整数
t.tzinfo #返回时区信息
t.replace(hour=16) #用新的时、分、秒、微秒替换,返回替换后的新time,不改变原time
t.isoformat() #返回'HH:MM:SS.mmmmmm'的字符串
timedelta类
创建
import datetime
td = datetime.timedelta(days=60)
#可用参数
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
使用
now = datetime.datetime.now()
#2017-06-19 10:13:03,901942
td = datetime.timedelta(days=60)
tl = now-td
#2017-04-20 10:13:03,901942
tf = now+td
#2017-08-18 10:13:03,901942