摘录 廖雪峰网站
datetime是python内置的处理日期和时间的标准库
获取当前日期和时间
>>> from datetime import datetime >>> print(datetime.now()) 2018-04-08 23:07:58.547082
获取指定日期和时间
>>> dt = datetime(2017,4,8,23,10) >>> print(dt) 2017-04-08 23:10:00
datetime转换为timestamp
实际上,计算机中都是用数字表示时间的。1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0
(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp。
timestamp的值与时区毫无关系,因为timestamp一旦确定,其UTC时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以timestamp表示的,因为全球各地的计算机在任意时刻的timestamp都是完全相同的(假定时间已校准)。
标准的:
timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
对应的北京时间为:
timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
调用timestamp方法可以将一个datetime类型的数据转化为timestamp类型的数据:
>>> dt = datetime(2017,4,8,23,10) >>> print(dt) 2017-04-08 23:10:00 >>> dt.timestamp() 1491664200.0
结果是一个浮点数,其中小数部分表示毫秒数。
timestamp转化为datetime
datetime的fromtimestamp()方法可以实现此功能:
>>> t= 1491664200.0 >>> print(datetime.fromtimestamp(t)) 2017-04-08 23:10:00
其实,上述的转换是timestamp和本地时间之间的转换。而本地时间是指操作系统设置的时区时间。使用utcfromtimestamp()可以转换为格林威治标准时间:
>>> print(datetime.utcfromtimestamp(t)) 2017-04-08 15:10:00
字符串str转换为datetime
>>> cday = datetime.strptime('2017-4-8 23:20:38','%Y-%m-%d %H:%M:%S') >>> print(cday) 2017-04-08 23:20:38
其中,字符串'%Y-%m-%d %H:%M:%S'
规定了日期和时间部分的格式
datetime转化为str
>>> print(datetime.now().strftime('%a/%b/%d %H:%M')) Sun/Apr/08 23:28
datetime的加减
>>> from datetime import datetime,timedelta >>> now = datetime.now() >>> now + timedelta(hours=8) datetime.datetime(2018, 4, 9, 7, 30, 3, 485905) >>> now - timedelta(days=2) datetime.datetime(2018, 4, 6, 23, 30, 3, 485905) >>> now - timedelta(days=2,hours = 2) datetime.datetime(2018, 4, 6, 21, 30, 3, 485905)
本地时间转换为UTC时间
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间是指UTC+0:00的时间。
一个datetime类型的数据有一个时区属性tzinfo,默认为None,可以给datetime设置一个时区:
>>> from datetime import datetime,timedelta,timezone >>> tz_utc_8 = timezone(timedelta(hours=8)) >>> now = datetime.now() >>> now datetime.datetime(2018, 4, 9, 22, 17, 41, 334741) >>> dt = now.replace(tzinfo=tz_utc_8) >>> dt datetime.datetime(2018, 4, 9, 22, 17, 41, 334741, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
时区转换
可以通过utcnow()获得当前的UTC时间,在转换为任意时区的时间:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) >>> print(utc_dt) 2018-04-09 14:21:48.205455+00:00 >>> bh_dt = utc_dt.astimezone(timezone(timedelta(hours=8))) >>> print(bh_dt) 2018-04-09 22:21:48.205455+08:00 >>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9))) >>> print(tokyo_dt) 2018-04-09 23:21:48.205455+09:00 >>> tokyo_dt2 = bh_dt.astimezone(timezone(timedelta(hours=9))) >>> print(tokyo_dt2) 2018-04-09 23:21:48.205455+09:00
例子中,utc_dt是一个UTC时间,并强制设置时区为UTC+0:00。这是后续的时区转换的关键。
astimezone()可以转换任意时区;
bh_dt是东八区的时间;tokyo_dt和tokyo_dt2都是东九区的时间,前者是通过utc_dt转换的,后者是通过东八区的时间转换的