Python 在时间日期方面的最佳实践。如:
time:【标准库】基本时间日期操作datetime:【标准库】time 的升级款,更倾向于成员提取以进行输出格式化与操作、感知时区。calendar:【标准库】日历
概述
时间类型
时间戳
timestamp:时间戳,float 类型,1970 年 1 月 1 日 00:00:00 开始的按秒的时间偏移量 (float)
1
| (time.time()/60/60/24/365)//1+1970
|
struct_time
struct_time:结构化时间对象元组,time.struct_time 类型
1 2 3 4 5 6 7 8 9
| time.localtime().tm_year time.localtime().time.localtime.tm_mon time.localtime().tm_day time.localtime().tm_hour time.localtime().tm_min time.localtime().tm_sec time.localtime().tm_wday time.localtime().tm_yday time.localtime().tm_isdst
|
FormatString:格式化时间字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| %Y 完整的年份 %y 年(后两位数字,以 0 补足两位)
%m 月份,[01,12] %b 月份的简写 4 月为 Apr %B 月份的全称 4 月为 April
%d 日期,[01,31]. %H 24 小时制的小时[00,23]. %M 分钟,[00,59]. %S 秒[00,61]. %f 微秒(以 0 补足六位)
%z 相对 UTC 时区偏移量,(格式是 ±HHMM[SS],未指定时区则返回空字符串)'+1030' %Z 时区名(未指定时区则返回空字符串) %a 星期几的简写 周三为 Web %A 星期几的全称 周三为 Wednesday %w 星期几(数字,0 是周日,6 是周六) %u 星期几(数字,1 是周一,7 是周日)
%c 标准的日期时间串 (04/07/10 10:43:39) %F 年-月-日 %x or %D 本地标准日期串,'05/14/19' %X 本地标准时间串,'14:24:24' %T 显示时分秒:hh:mm:ss
%I 12 小时制的小时[01,12]. %p 上午 下午 AM or PM.
%u 每周的第几天,星期一为第一天 (值从 0 到 6,星期一为 0) %U 第年的第几周,把星期日做为第一天(值从 0 到 53) %U 一年中的第几周(以全年首个周日后的星期为第 0 周,以 0 补足两位) %V 每年的第几周,使用基于周的年,一年中的第几周(以全年首个包含 1 月 4 日的星期为第 1 周,以 0 补足两位) %W 每年的第几周,星期一为第一天(0-53) %w 一个星期中的第几天(0-6)星期天为 6 %j 一年中的第几天(以 0 补足三位) %e 在两字符域中,十进制表示的每月的第几天
|
time
time:【标准库】基本时间日期操作
获取
1 2 3 4 5 6 7 8 9 10 11
| time.time()
time.gmtime() time.localtime()
time.ctime() time.asctime()
|
其他
1 2
| time.altzone time.clock()
|
转换
1 2 3 4 5 6 7 8 9 10 11
| timestamp=time.time() time.localtime(timestamp) time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) time.strptime('2011-12-01 14:15:40','%Y-%m-%d %H:%M:%S') time.mktime(time.localtime())
today_date = time.strftime('%Y-%m-%d', time.localtime()) "2021-01-01" now_timestamp=time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime())+'_'+str(int(time.time()%1*1000)) "2021-01-01-12-30-45-125"
|
暂停 -sleep
datetime
datetime:【标准库】time 的升级款,更倾向于成员提取以进行输出格式化与操作、感知时区。
- 需要时区信息才能确定一个特定的时间,否则·只能设定为本地时间
- 若要存储
datetime,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from datetime import datetime
datetime.date() datetime.time() datetime.datetime():表示日期时间的类;
datetime.datetime.today() datetime.datetime.now() datetime.datetime.now().replace(year=2000,month=10,day=1)
datetime(year,month,day,hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
datetime(2019,12,6,13,30,50)
参数范围:
- MINYEAR <= year <= MAXYEAR - 1 <= month <= 12 - 1 <= day <= 指定年月的天数 - 0 <= hour < 24 - 0 <= minute < 60 - 0 <= second < 60 - 0 <= microsecond < 1000000
|
转换
时间戳转 datetime
1
| datetime.datetime.fromtimestamp(time.time())
|
转时间戳
1 2 3 4
| d = datetime.datetime(1997,12,29,15,59,59) t = d.timetuple() print(time.mktime(t))
|
时间操作
1 2 3 4 5 6 7
| datetime.timedelta():表示时间间隔,即两个时间点之间的长度;
s=datetime.now()+datetime.timedelta(days=1) s=datetime.now()+datetime.timedelta(minutes=30) s=datetime.now()+datetime.timedelta(hours=3)
s.replace(year=2020,month=11,day=30)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| def datetime_filter(t): delta = int(time.time() - t) if delta < 60: return u'1 分钟前' if delta < 3600: return u'%s 分钟前' % (delta // 60) if delta < 86400: return u'%s 小时前' % (delta // 3600) if delta < 604800: return u'%s 天前' % (delta // 86400) dt = datetime.fromtimestamp(t) return u'%s 年%s 月%s 日' % (dt.year, dt.month, dt.day)
now=datetime.datetime.now() now.strftime('%Y-%m-%d %H:%M:%S') now.strftime('%Y-%m-%d') now.strftime('%H-%M-%S')
|
calendar
calendar:【标准库】日历
1 2 3 4 5 6 7 8 9 10
| import calendar print() calendar.monthrange(year,month)
calendar.monthcalendar(2018,11)
calendar.calendar(2020)
calendar.isleap(year)
|