- datetime模块(官方文档)
datetime本身是一个模块,其下包含一个datetime类。
from datetime import datetime
temp = datetime.now()
print(temp)
>> 2018-12-17 18:08:56.879317
td = datetime(2018, 12, 18, 13, 24, 16)
print(td)
>> 2018-12-18 13:24:16
问题来了:18:08:56.879317后面的.879317怎么去掉?
很明显是时间的更细定义,但是实际中很多时候用不到,怎么取消呢?
- 时间戳
时间戳(Timestamp 维基)是指字符串或编码信息用于辨识记录下来的时间日期。国际标准为ISO 8601。
计算机中时间用数字表示,人为规定1970年1月1日00:00:00 UTC+00:00时区的时刻称为epoch time,记为0(1970年之前的时间timestamp为负数),当前时间就是相对于epoch time的**秒数**,称为timestamp。
timestamp = 0 = 1970-1-1 00:00:00 UTC+00:00= 1970-1-1 08:00:00 UTC+8:00
全球各地的计算机在任意时刻的timestamp都是完全相同的。
- datetime类型转换为timestamp
from datetime import datetime
td = datetime(2018, 12, 18, 13, 24, 16)
tt = td.timestamp()
print(tt)
>> 1545110656.0
print(type(tt))
>> <class 'float'>
Python中timestamp是秒数,数据类型是float。如果有小数,小数位表示毫秒数。
java中timestamp使用整数表示毫秒数,此时把timestamp除以1000就得到Python的浮点表示方法。
- timestamp转换为datetime
from datetime import datetime
t = 21397329
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09
t = 21397329.1
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09.100000
- 时区问题
timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。
本地时间是指当前操作系统设定的时区。
timestamp也可以直接转换成UTC标准时区的时间:
from datetime import datetime
t = 21397329
print(datetime.fromtimestamp(t))
>> 1970-09-05 23:42:09
print(datetime.utcfromtimestamp(t))
>> 1970-09-05 15:42:09
- datetime与str字符串的相互转换
输入信息经常是字符串格式,要处理时间问题就需要把str转换成datetime。采用datetime.strptime()函数实现:
from datetime import datetime
# 注意%Y-%m-%d区分大小写
cday = datetime.strptime('2018-12-12 19:05:21', '%Y-%m-%d %H:%M:%S')
print(cday)
>> 2018-12-12 19:05:21
datetime转换成str则通过datetime.strftime()函数
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b, %d, %H:%M:%S'))
>> Mon, Dec, 17, 19:10:47
- datetime时间加减
直接±操作,只是需要用到timedelta这个类的辅助。
from datetime import datetime,timedelta
now = datetime.now()
now1 = now + timedelta(days=1, hours=2)
print(now, '\n',now1)
>> 2018-12-17 19:15:17.234980
>> 2018-12-18 21:15:17.234980
- timezone关于时区的一个类
from datetime import datetime,timedelta,timezone
tz_utc_8 = timezone(timedelta(hours=8))
print(tz_utc_8)
>> UTC+08:00
now = datetime.now()
print(now)
>> 2018-12-17 19:53:50.374284
n_t = now.replace(tzinfo=tz_utc_8)
print(n_t)
>> 2018-12-17 19:53:50.374284+08:00
datetime类有一个时区属性tzinfo,默认None,所以无法区分这个datetime到底是哪个时区,上述代码强行给其设置一个时区。
- 当前UTC时间utcnow()
from datetime import datetime,timedelta,timezone
now = datetime.now()
utc_dt = datetime.utcnow()
utc_dt_tz = datetime.utcnow().replace(tzinfo=timezone.utc)
print(now, utc_dt, utc_dt_tz)
>> 2018-12-17 20:02:17.404285
>> 2018-12-17 12:02:17.404285
>> 2018-12-17 12:02:17.404285+00:00
- astimezone()更改时区
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>> 2018-12-17 12:02:17.404285+08:00
更改时区的流程是,先拿到一个datetime,强制设置时区tzinfo,作为基准时间,之后利用astimezone()方法,更改成特定时区。
- 本地时间与UTC标准时间转换
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。
- 参考
.
.
.
2018-12-17 20:22:53写于杭州前往济南的高铁上