获取代表当前日期和时间的 datetime
对象
from datetime import datetime
now = datetime.now()
print(now) # 2020-01-08 00:16:12.865886
从指定的日期和时间获取 datetime
对象
from datetime import datetime
dt = datetime(2020, 1, 7, 23, 59)
print(dt) # 2020-01-07 23:59:00
datetime
对象与 timestamp(时间戳)的相互转换
在计算机中,时间实际上是用数字表示的。我们把 1970 年 1 月 1 日 00:00:00 UTC+00:00 时区的时刻称为 epoch time,记为 0
,当前时间就是相对于 epoch time 的秒数,称为 timestamp(1970 年以前的时间 timestamp 为负数)。
timestamp 的值与时区毫无关系,因为 timestamp 一旦确定,其 UTC 时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以 timestamp 表示的,因为全球各地的计算机在任意时刻的 timestamp 都是完全相同的。
datetime
对象转换为 timestamp
from datetime import datetime
dt = datetime(2020, 1, 7, 23, 59)
dt.timestamp() # 1578412740.0
:::warning
注意:Python 的 timestamp 是一个浮点数,整数位表示秒数,小数位表示毫秒数。而 JavaScript、Java 等语言中,timestamp 是一个整数,表示毫秒数。
:::
timestamp 转换为 datetime
对象
from datetime import datetime
t = 1578412740.0
dt = datetime.fromtimestamp(t)
print(dt) # 2020-01-07 23:59:00
datetime
对象与字符串的相互转换
字符串转 datetime
from datetime import datetime
dt = datetime.strptime("2020-1-7 23:59:59", "%Y-%m-%d %H:%M:%S")
print(dt) # 2020-01-07 23:59:00
:::info
字符串 %Y-%m-%d %H:%M:%S
规定了日期和时间的格式。详细的说明可以参考 Python 文档。
:::
datetime
转字符串
from datetime import datetime
now = datetime.now()
strdt = now.strftime("%a, %b %d %H:%M")
print(strdt) # Wed, Jan 08 00:38
datetime
加减
from datetime import datetime, timedelta # 需要导入 timedelta 类
now = datetime.now()
print(now) # 2020-01-08 00:41:15.807337
dt1 = now + timedelta(days=1)
print(dt1) # 2020-01-09 00:41:15.807337
dt2 = now - timedelta(hours=5, days=3)
print(dt2) # 2020-01-04 19:41:15.807337
改变 datetime
对象的时区信息
datetime
对象默认使用是本地时区,即如果在国内,用的是 UTC+08:00
。
所以下面这种情况下计算的时间戳是错的:
from datetime import datetime
dt = datetime.fromisoformat('2022-02-19T10:08:53.000000')
dt.timestamp()
2022-02-19T10:08:53.000000
是符合 ISO 8601
格式的 UTC
时间,然而 datetime.fromisoformat()
将其当作 UTC+08:00
时间转换成了 datetime
对象,因此使用 dt.timestamp()
获取的时间戳比实际想得到的时间戳慢 8 小时。
怎么解决呢?
import pytz
from datetime import datetime
dt = datetime.fromisoformat('2022-02-19T10:08:53.000000')
dt = dt.replace(tzinfo=pytz.utc) # 将时区信息转换为 UTC
dt.timestamp()