Python常用模块:date、datetime、calendar

一:时间元组

时间元组将时间拆分成各个部分。

下标 属性 描述
0 tm_year 2008
1 tm_mon 1 到 12
2 tm_mday 1 到 31
3 tm_hour 0 到 23
4 tm_min 0 到 59
5 tm_sec 0 到 61 (60或61 是闰秒)
6 tm_wday 0到6 (0是周一)
7 tm_yday 一年中的第几天,1 到 366
8 tm_isdst 是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1

二:常用方法

时间间隔是以秒为单位的浮点小数。每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。

函数 描述 示例
time.time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数) 1575798460.997638
time.localtime(time.time()) 本地时间元组 time.struct_time(tm_year=2019, tm_mon=12, tm_mday=8, tm_hour=17, tm_min=53, tm_sec=9, tm_wday=6, tm_yday=342, tm_isdst=0)
time.gmtime(time.time()) 接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0 time.struct_time(tm_year=2019, tm_mon=12, tm_mday=8, tm_hour=13, tm_min=5, tm_sec=19, tm_wday=6, tm_yday=342, tm_isdst=0)
time.asctime(time.localtime(time.time())) 获取asc格式时间 ‘Sun Dec 8 17:55:22 2019’
time.ctime() 等于time.asctime(time.localtime(time.time()))
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 格式化日期 2019-12-08 18:06:48
time.strptime(“2019-12-08 20:43:34”, “%Y-%m-%d %H:%M:%S”) 将日期字符串转为时间元祖struct_time time.struct_time(tm_year=2019, tm_mon=12, tm_mday=8, tm_hour=20, tm_min=43, tm_sec=34, tm_wday=6, tm_yday=342, tm_isdst=-1)
time.mktime(struct_time) 将时间元祖转为时间戳 1575809014.0
time.sleep(secs) 让线程睡眠几秒
time.timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲) -28800

三:datetime:

datetime模块将时间日期细分了

  • date 日期(年月日)
  • time 时间(时分秒)
  • datetime(date + time)
  • timezone(时区)
  • timedelta(时间间隔)
函数 描述 示例
datetime.datetime.now() 当前时间 datetime.datetime(2019, 12, 9, 11, 58, 3, 823844)
datetime.datetime.now().date() 获取当前日期 datetime.date(2019, 12, 9)
datetime.date.today() + datetime.timedelta(days=1) 明天 datetime.date(2019, 12, 10)
datetime.datetime.now() - datetime.timedelta(days=3) 3天前 datetime.datetime(2019, 12, 6, 12, 5, 9, 95893)
datetime.datetime.combine(datetime.date.today(), datetime.time.min) 日期和时间组合(当天开始时间) datetime.datetime(2019, 12, 9, 0, 0)
datetime.datetime.combine(datetime.date.today(), datetime.time.max) 日期和时间组合(当天结束时间) datetime.datetime(2019, 12, 9, 23, 59, 59, 999999)
(datetime.datetime(2019, 12, 9, 0, 0, 0) - datetime.datetime.now()).total_seconds() 获取两个日期的差的秒数 43854.034031

本周最后一天
datetime.date.today() + datetime.timedelta(6 - today.weekday())

本月最后一天

>>> import calendar
>>> today = datetime.date.today()
>>> _, last_day_num = calendar.monthrange(today.year, today.month)
>>> last_day = datetime.date(today.year, today.month, last_day_num)
>>> last_day
datetime.date(2015, 1, 31)

获取上个月的最后一天(可能跨年)

>>> import datetime
>>> today = datetime.date.today()
>>> first = datetime.date(day=1, month=today.month, year=today.year)
>>> lastMonth = first - datetime.timedelta(days=1)

Datetime / String / timestamp / time tuple 转换

Datetime / String / timestamp / time tuple

datetime -> string : strftime()

datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

string -> datetime: strptime()

datetime.datetime.strptime("2014-12-31 18:20:10", "%Y-%m-%d %H:%M:%S")

datetime -> timetuple: timetuple()
datetime.datetime.now().timetuple()

datetime -> date
datetime.datetime.now().date()

date -> datetime
today = datetime.date.today()
datetime.datetime.combine(today, datetime.time())
datetime.datetime.combine(today, datetime.time.min)


datetime -> timestamp
now = datetime.datetime.now()
timestamp = time.mktime(now.timetuple())
now.timestamp()

timestamp -> datetime
本地时间
datetime.datetime.fromtimestamp(1421077403.0)
UTC时间
datetime.utcfromtimestamp(t)


timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的
某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
datetime可以通过timedelta加减法来加减操作


本地时间转换为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)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
如果系统时区恰好是UTC+8:00,那么上述代码就是正确的,否则,不能强制设置为UTC+8:00时区。

常用时间处理方法
https://www.runoob.com/python/python-date-time.html

datetime.now()
datetime.fromtimestamp(int(enable_time) / 1000)

今天 today = datetime.date.today()
昨天 yesterday = today - datetime.timedelta(days=1)
上个月 last_month = today.month - 1 if today.month - 1 else 12
当前时间戳 time_stamp = time.time()
时间戳转datetime datetime.datetime.fromtimestamp(time_stamp)
datetime转时间戳 int(time.mktime(today.timetuple()))
datetime转字符串 today_str = today.strftime("%Y-%m-%d")
字符串转datetime today = datetime.datetime.strptime(today_str, "%Y-%m-%d")
补时差 today + datetime.timedelta(hours=8)

四:日期格式化

  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %H 24小时制小时数(0-23)
  • %I 12小时制小时数(01-12)
  • %M 分钟数(00=59)
  • %S 秒(00-59)
  • %a 本地简化星期名称
  • %A 本地完整星期名称
  • %b 本地简化的月份名称
  • %B 本地完整的月份名称
  • %c 本地相应的日期表示和时间表示
  • %j 年内的一天(001-366)
  • %p 本地A.M.或P.M.的等价符
  • %U 一年中的星期数(00-53)星期天为星期的开始
  • %w 星期(0-6),星期天为星期的开始
  • %W 一年中的星期数(00-53)星期一为星期的开始
  • %x 本地相应的日期表示
  • %X 本地相应的时间表示
  • %Z 当前时区的名称
  • %% %号本身
发布了312 篇原创文章 · 获赞 943 · 访问量 135万+

猜你喜欢

转载自blog.csdn.net/vbirdbest/article/details/103466237