datetime 是 Python 处理日期和时间的标准库。
获取当前日期和时间
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
# 获取当前datetime:
now = datetime.now()
print(now)
print(type(now))
注意: datetime 是模块,datetime 模块还包含一个 datetime 类,通过 from datetime import datetime 导入的才是 datetime 这个类。
如果仅导入 import datetime,则必须引用全名 datetime.datetime。
datetime.now() 返回当前日期和时间,其类型是 datetime。
获取指定日期和时间
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = datetime(2020,5,20,13,14)
print(t)
datetime 转换为 timestamp
在计算机中,时间实际上是用数字表示的。我们把 1970 年 1 月 1 日 00:00:00 UTC+00:00 时区的时刻称为 epoch time ,记为 0(1970年以前的时间timestamp为负数),当前时间就是相对于 epoch time 的秒数,称为timestamp。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = datetime(2020,5,20,13,14)
print(t.timestamp())
注意: Python 的 timestamp 是一个浮点数。如果有小数位,小数位表示毫秒数。
timestamp 转换为 datetime
使用 datetime 提供的 fromtimestamp() 方法:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
t = 1589951640.0
print(datetime.fromtimestamp(t)) # 本地时间
print(datetime.utcfromtimestamp(t)) # UTC时间
注意: timestamp 是一个浮点数,它没有时区的概念,而 datetime 是有时区的。
str 转换为 datetime
使用 datetime 提供的 strptime() 方法:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
day = datetime.strptime('2020-5-20 13:14:00','%Y-%m-%d %H:%M:%S')
print(day)
注意: 转换后的 datetime 是没有时区信息的。
datetime 转换为 str
转换方法是通过 strftime() 实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
datetime 加减
需要导入 timedelta 这个类,使用 timedelta 你可以很容易地算出前几天和后几天的时刻。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime, timedelta
cday = datetime.strptime('2020-5-20 13:14:00', '%Y-%m-%d %H:%M:%S')
print('current datetime =', cday)
print('current + 10 hours =', cday + timedelta(hours=10))
print('current - 1 day =', cday - timedelta(days=1))
print('current + 2.5 days =', cday + timedelta(days=2, hours=12))
本地时间转换为 UTC 时间
本地时间是指系统设定时区的时间,例如北京时间是 UTC+8:00 时区的时间,而UTC时间指 UTC+0:00 时区的时间。
时区转换的关键在于,拿到一个 datetime 时,要获知其正确的时区,然后强制设置时区,作为基准时间。
利用带时区的 datetime,通过 astimezone() 方法,可以转换到任意时区。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—datetime '
__author__ = 'Kevin Gong'
from datetime import datetime, timedelta, timezone
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
utc8_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
print('UTC+0:00 now =', utc_dt)
print('UTC+8:00 now =', utc8_dt)
注意:不是必须从 UTC+0:00 时区转换到其他时区,任何带时区的 datetime 都可以正确转换。
小结
datetime 表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。
如果要存储 datetime,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。