Python的收集整理:datetime模块

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

你可能感兴趣的:(Python的收集整理:datetime模块)