>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2018-04-06 20:24:30.764172
>>> print(type(now))
<class 'datetime.datetime'>
注意到datetime
是模块,datetime
模块还包含一个datetime
类,通过from datetime import datetime
导入的才是datetime
这个类。
如果仅导入import datetime
,则必须引用全名datetime.datetime
。
datetime.now()
返回当前日期和时间,其类型是datetime
。
要指定某个日期和时间,我们直接用参数构造一个datetime
:
>>> dt = datetime(2018,4,30,4,21,43)
>>> print(dt)
2018-04-30 04:21:43
把一个datetime
类型转换为timestamp
只需要简单调用timestamp()
方法:
>>> dt.timestamp()
1525033303.0
要把timestamp
转换为datetime
,使用datetime
提供的fromtimestamp()
方法:
>>> t = 1600000000.0
>>> print(datetime.fromtimestamp(t))
2020-09-13 20:26:40
很多时候,用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()
实现,需要一个日期和时间的格式化字符串:
>>> cday = datetime.strptime('2018-4-6 21:00:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2018-04-06 21:00:59
字符串'%Y-%m-%d %H:%M:%S'
规定了日期和时间部分的格式。
如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()
实现的,同样需要一个日期和时间的格式化字符串:
>>> now = datetime.now()
>>> print(now)
2018-04-06 20:58:42.534038
>>> print(now.strftime('%a,%b %d %H:%M'))
Fri,Apr 06 20:58
对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+
和-
运算符,不过需要导入timedelta
这个类:
>>> from datetime import datetime, timedelta, timezone
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 4, 6, 21, 3, 54, 668377)
>>> now + timedelta(hours=10)
datetime.datetime(2018, 4, 7, 7, 3, 54, 668377)
>>> now - timedelta(days=1)
datetime.datetime(2018, 4, 5, 21, 3, 54, 668377)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2018, 4, 9, 9, 3, 54, 668377)
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。
一个datetime
类型有一个时区属性tzinfo
,但是默认为None
,所以无法区分这个datetime
到底是哪个时区,除非强行给datetime
设置一个时区:
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 4, 6, 21, 10, 24, 942726)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2018, 4, 6, 21, 10, 24, 942726, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
如果系统时区恰好是UTC+8:00,那么上述代码就是正确的,否则,不能强制设置为UTC+8:00时区。
# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2018-04-06 13:18:11.351108+00:00
# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2018-04-06 21:18:11.351108+08:00
# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2018-04-06 22:18:11.351108+09:00
# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2018-04-06 22:18:11.351108+09:00
时区转换的关键在于,拿到一个datetime
时,要获知其正确的时区,然后强制设置时区,作为基准时间。
利用带时区的datetime
,通过astimezone()
方法,可以转换到任意时区。