Python常用的内建模块1:datetime

datetime:Python处理日期和时间的标准库
  • 获取当前日期和时间:
>>> from datetime import datetime >>> now = datetime.now() # 获取当前datetime >>> print(now) 2018-07-17 14:45:23.464380

datetime是模块, datetime模块中还包含了datetime类, 通过from datetime import datetime导入的才是datetime这个类
如果仅导入improt datetime, 则需要引用全名datetime.datetime.或者导入import datetime as dt, 使用dt.datetime使用
  • 获取指定日期和时间
要指定某个日期和时间, 我们直接用参数构造一个datetime
>>> from datetime import datetime >>> dt = datetime(2018, 7, 17, 14, 45) # 用指定日期时间创建datetime >>> print(dt) 2018-07-17 14:45:00

  • datetime转换成timestamp
把一个datetime类型转换成timestamp类型只需要简单的调用timestamp()方法即可:
>>> from datetime import datetime >>> dt = datetime(2018, 7, 17, 14, 45) # 用指定日期时间创建datetime >>> dt.timestamp() # 把datetime转换为timestamp 1531809900.0

  • timestamp转换为datetime
要把timestamp转换成datetime简单的调用datetime提供的fromtimestamp即可:
>>> from datetime import datetime >>> t = 1531809900.0 >>> print(datetime.fromtimestamp(t)) 2018-07-17 14:45:00

注意到timestamp是一个浮点数, 它没有时区的概念, 而datetime是有时区的概念.上述的转换是在timestamp和本地时间做转换.
本地时间是指当前操作系统设定的时区. 例如北京时间是东八区, 则本地时间就是
2018-07-17 14:45:00

实际上就是UTC+8:00时区的时间:
2018-07-17 14:45:00 UTC+8:00

而此时的格林威治标准时间和北京相差8个小时, 也就是UTC+0:00时区的时间应该是:
2018-07-17 06:45:00 UTC+0:00

当然了timestamp也可以直接转成UTC标准时区的时间:
>>> from datetime import datetime >>> t = 1531809900.0 >>> print(datetime.fromtimestamp(t)) # 本地时间 2018-07-17 14:45:00 >>> print(datetime.utcfromtimestamp(t)) # UTC时间 2018-07-17 06:45:00

  • str转换为datetime
很多时候用户输入的日期和时间是字符, 要处理日期和时间, 首先必须要把str转换成datetime.转换方式是通过datetimedatetime.strptime()实现, 需要一个日期和时间的格式化字符串:
>>> from datetime import datetime >>> time = datetime.strptime('2018-7-17 14:45:00','%Y-%m-%d %H:%M:%S') >>> print(time) 2018-07-17 14:45:00

字符串%Y-%m-%d %H:%M:%S规定了日期和时间部分的格式. 详情参考Python官方文档
  • datetime转换为str
如果要把datetime对象, 要把它格式化为字符串给用户看, 需要datetimestrftime()来实现:
>>> from datetime import datetime >>> now = datetime.now() >>> timeStr = now.strftime('%Y-%m-%d %H:%M:%S') >>> print(timeStr) 2018-07-17 15:17:20

  • datetime加减
【Python常用的内建模块1:datetime】对日期和时间的加减实际上就是把datetime往后或者往前计算, 得到新的datetime.加减可以直接用+-运算符, 不过需要导入timedelta这个类:
from datetime import timedelta, datetime >>> now = datetime.now() >>> print(now) 2018-07-17 15:30:36.501466 >>> now + timedelta(hours=1) datetime.datetime(2018, 7, 17, 16, 30, 36, 501466) >>> now - timedelta(hours=20) datetime.datetime(2018, 7, 16, 19, 30, 36, 501466) >>> now - timedelta(days=1, hours=10) datetime.datetime(2018, 7, 16, 5, 30, 36, 501466)

  • 本地时间转换为UTC时间
本地时间是指系统设定时区的时间, 例如北京时间是UTC+8:00时区, 而UTC时间指UTC+0:00时区的时间
一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区, 除非强行给datetime设置一个时区
>>> from datetime import datetime, timedelta, timezone >>> tz_utc_8 = timezone(timedelta(hours=8)) >>> now = datetime.now() >>> now datetime.datetime(2018, 7, 17, 16, 26, 4, 208044) >>> dt = now.replace(tzinfo=tz_utc_8) >>> dt datetime.datetime(2018, 7, 17, 16, 26, 4, 208044, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

如果系统时区恰好是UTC+8:00, 那么上述代码是正确的, 否则不能强制设置
  • 时区转换
我们可以通过utcnow()拿到当前的UTC时间, 在转换为任意时区的时间
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) >>> print(utc_dt) #获取UTC时间 2018-07-17 08:30:24.605313+00:00 >>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8))) >>> print(bj_dt)#获取北京时间 2018-07-17 16:30:24.605313+08:00 >>> dj_dt = utc_dt.astimezone(timezone(timedelta(hours=9))) >>> print(dj_dt)#获取东京时间 2018-07-17 17:30:24.605313+09:00 >>> dj_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9))) >>> print(dj_dt2) #从北京时间获取东京时间 2018-07-17 17:30:24.605313+09:00

时区的转换在于拿到一个datetime时间, 要获知正确的时区, 然后强制设置时区, 作为基准时间.
利用带时区的datetime, 通过astimezone()方法可以转换到任意时区.

    推荐阅读