datetime是Python处理日期和时间的标准库。
最近在搞时间字符串,很是头疼,搜了搜datetime的,感觉总结的不太实用,干脆我自己按照管饭手册和现在使用的一些经验总结了,喜欢的小伙伴记得关注收藏。
官方文档:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。
如果仅导入import datetime,则必须引用全名datetime.datetime。
datetime.now()返回当前日期和时间,其类型是datetime。
from datetime import datetime
now = datetime.now()
print(now)
print(type(now))
结果:
2020-05-19 10:41:07.513300
<class 'datetime.datetime'>
函数:
datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
例子
dt1 = datetime(2020, 4, 19, 12 ,25 ,32) # 用指定日期时间创建datetime
dt2 = datetime(2020,5,7)
print(dt1,dt2)
结果:
2020-04-19 12:25:32 2020-05-07 00:00:00
后边不填的话,自动补零
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时(UTC,
Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean
Time)一样,都与英国伦敦的本地时相同。UTC与GMT含义完全相同。
datetime.utcnow()
now = datetime.now()
now_str = now.strftime("%Y/%m/%d %H:%M:%S")
now_utc = datetime.utcnow()
print(now,'\r\n',now_utc)
结果:
2020-05-19 11:02:55.545860
2020-05-19 03:02:55.545860
如果时间戳是由平台的C支持的值的范围从gmtime()功能,并OSError在gmtime()故障。通常将其限制在1970年到2038年之间。
要获取感知datetime对象,请使用fromtimestamp():
具体来说,此函数支持以下格式的字符串:
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
举例:
from datetime import datetime
datetime.fromisoformat('2011-11-04')
datetime.fromisoformat('2011-11-04T00:05:23')
datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.fromisoformat('2011-11-04T00:05:23+04:00')
也可返回星期datetime.weekday(),以整数形式返回星期几,其中星期一为0,星期日为6
now = datetime.now()
print(now.date())
print(now.time())
print(tom.weekday())
print(type(now.date()))
结果:
2020-05-19
11:11:58.490936
1
<class 'datetime.date'>
如果想单独获取当前月份或年份等属性:
year, month, day, hour=0, minute=0, second=0, microsecond=0
这些属性返回的就是int类型,可以直接用于判断
from datetime import datetime,timedelta
now = datetime.now()
delta = timedelta(days=50)
print(now)
print(now.year)
print(now.minute)
print(now.second)
print(type(now.year))
print(now.year == 2020)
结果:
2020-05-19 11:32:14.103423
2020
32
14
<class 'int'>
True
datetime.replace(year = self.year,month = self.month,day = self.day,hour = self.hour,minutes = self.minute,second = self.second,microsecond = self.microsecond,tzinfo = self.tzinfo,* fold = 0 )
now = datetime.now()
tom = now.replace(day=20)
print(now,tom)
结果:
2020-05-19 11:14:30.883869 2020-05-20 11:14:30.883869
甲timedelta对象表示的持续时间,两个日期或时间之间的差
class datetime.timedelta(days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0)
我们可以利用timedelta实现日期时间的加减,比如当前时间加50天:
from datetime import datetime,timedelta
now = datetime.now()
delta = timedelta(days=50)
print(now)
print(now+delta)
print(now-delta)
结果:
2020-05-19 11:24:43.753700
2020-07-08 11:24:43.753700
2020-03-30 11:24:43.753700
关于比较:
这里timedelta定义的天数为timedelta对象,和数字5是不一样的,但是如果都是timedelta对象,之间可以比较
>>> from datetime import timedelta
>>> delta1 = timedelta(seconds=57)
>>> delta2 = timedelta(hours=25, seconds=2)
>>> delta2 != delta1
True
>>> delta2 == 5
False
很多时候,用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串:
字符串’%Y/%m/%d %H:%M:%S’规定了日期和时间部分的格式
注意转换后的datetime是没有时区信息的。
from datetime import datetime
ond_start_time=datetime.strptime("2019/07/31 00:00:00","%Y/%m/%d %H:%M:%S")
print(ond_start_time)
print(type(ond_start_time))
结果:
2019-07-31 00:00:00
<class 'datetime.datetime'>
from datetime import datetime
now = datetime.now()
str_now = now.strftime("%Y/%m/%d %H:%M:%S")
print(str_now)
print(type(str_now))
结果:
2020/05/19 11:44:39
<class 'str'>
当然,比如pandas有pd.to_datetime(data,format="%Y/%m/%d %H:%M:%S")之类的函数,也是可以将str批量转为datetime的,这里就不过多介绍了。