一:时间元组
时间元组将时间拆分成各个部分。
下标 | 属性 | 描述 |
---|---|---|
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 当前时区的名称
- %% %号本身