python—时间模块(time模块,datetime模块)

文件的时间戳

系统中文件存在三个时间戳:
atime:文件内容最后一次被访问的时间戳
mtime:文件内容最后一次被修改的时间戳
ctime:文件内容或者属性最后一次被修改的时间戳

stat 文件名称 #查看文件的时间戳
touch 文件名称 #同时修改文件的三个时间戳

[root@foundation47 public]# stat lala    # 查看文件的时间戳
  File: ‘lala’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 271429794   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2019-06-07 12:20:07.206887783 +0800  # atime
Modify: 2019-06-07 12:20:07.206887783 +0800   # mtime
Change: 2019-06-07 12:22:08.639886676 +0800  # ctime
 Birth: -
[root@foundation47 public]# touch lala # 使用touch命令 同时修改文件的三个时间戳
[root@foundation47 public]# stat lala
  File: ‘lala’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 271429794   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2019-06-07 15:45:08.971775666 +0800
Modify: 2019-06-07 15:45:08.971775666 +0800
Change: 2019-06-07 15:45:08.971775666 +0800    # 三个时间戳同时更新
 Birth: -
[root@foundation47 public]# cat lala   # 访问文件的内容
[root@foundation47 public]# stat lala
  File: ‘lala’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 271429794   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2019-06-07 15:50:44.408772609 +0800    # atime 更新
Modify: 2019-06-07 15:45:08.971775666 +0800
Change: 2019-06-07 15:45:08.971775666 +0800
 Birth: -
[root@foundation47 public]# chmod 777 lala   # 改变文件的权限属性
[root@foundation47 public]# stat lala
  File: ‘lala’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 271429794   Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2019-06-07 15:50:44.408772609 +0800
Modify: 2019-06-07 15:45:08.971775666 +0800
Change: 2019-06-07 15:51:01.427772454 +0800    # ctime更新
 Birth: -
[root@foundation47 public]# echo hahaha > lala  #改变文件内容
[root@foundation47 public]# stat lala
  File: ‘lala’
  Size: 7         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 271429794   Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2019-06-07 15:50:44.408772609 +0800
Modify: 2019-06-07 15:51:16.302772319 +0800     # mtime更新
Change: 2019-06-07 15:51:16.302772319 +0800  # ctime更新
 Birth: -
python 中获取文件的时间戳

import os #必须先导入os模块
os.path.getatime('/public/lala') # 获取文件的atime
os.path.getmtime('/public/lala') # 获取文件的mtile
os.path.getctime('/public/lala') #获取文件的ctime

注意:通过次方式获得的时间都是时间戳形式的时间

import os
ctime = os.path.getctime('/public/lala')
mtime = os.path.getmtime('/public/lala')
atime = os.path.getatime('/public/lala')
print(ctime)
print(mtime)
print(atime)

#输出结果:
1559893876.3027723
1559893876.3027723
1559893844.4087727   # 输出时间戳形式的时间

time 模块

1、时间表示的几种类型

1). 时间戳
2). 字符串的时间
3). 元组类型的时间

import time               #导入时间time模块
print(time.time())        #输出当前时间(时间戳)
print(time.ctime())       #输出当前时间(字符串时间)
print(time.localtime())   #输出当前时间(元组时间)

#输出结果:
1559897430.7819257    #时间戳时间
Fri Jun  7 16:50:30 2019  #字符串时间
time.struct_time(tm_year=2019, tm_mon=6, tm_mday=7, tm_hour=16, tm_min=50, tm_sec=30, tm_wday=4, tm_yday=158, tm_isdst=0)  #元组时间

时间戳:
时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示,时间戳单位最适于做日期运算

元组时间:
用一个元组装起来的9组数字处理时间:

属性
tm_year 年份;四位数字
tm_mon 月份;1 到 12
tm_mday 天;1 到 31
tm_hour 小时; 0 到 23
tm_min 分钟; 0 到 59
tm_sec 秒; 0 到 61 (60或61 是闰秒)
tm_wday 一周的第几天; 0到6 (0是周一)
tm_yday 一年的第几天; 1 到 366(儒略历)
tm_isdst -1, 0, 1, -1是决定是否为夏令时的旗帜

可以通过属性关键字得到其所对应的具体的时间信息:
info = time.localtime() # 用一个变量接收元组时间
info.tm_year # 返回年份
info.tm_mon # 返回月份
元组时间的九个属性都可以分别输出。

应用练习

需求
利用time.time()方法,我们可以计算两个时间点
之间的时间间隔,但是有些时候我们想要得到/etc/group
文件的最后a/c/m的时间,对应的年月日这些信息
并保存再文件date.txt文件中

import os
import time
atime = os.path.getatime('/public/lala')
mtime = os.path.getmtime('/public/lala')
ctime = os.path.getctime('/public/lala')
tuple_atime = time.localtime(atime)
tuple_mtime = time.localtime(mtime)
tuple_ctime = time.localtime(ctime)
with open('/public/lala_date.txt','a')as f:
    f.write('atime'.center(40,'*'))
    f.write('\n')
    f.write('%d %d %d\n' %(tuple_atime.tm_year,tuple_atime.tm_mon,tuple_atime.tm_mday))
    f.write('mtime'.center(40,'*'))
    f.write('\n')
    f.write('%d %d %d\n' %(tuple_mtime.tm_year,tuple_mtime.tm_mon,tuple_mtime.tm_mday))
    f.write('ctime'.center(40,'*'))
    f.write('\n')
    f.write('%d %d %d\n' %(tuple_ctime.tm_year,tuple_ctime.tm_mon,tuple_ctime.tm_mday))
    
#输出结果:
*****************atime******************
2019 6 7
*****************mtime******************
2019 6 7
*****************ctime******************
2019 6 7

2 、常用的时间转换

1 把元组的时间转换为时间戳
time.mktime(tuple_time) # 将给出的元组时间转化成时间戳。
注意:不能将字符串时间转化成时间戳

import time
tuple_time = time.localtime()
print(tuple_time)
tuple_time2 = time.mktime(tuple_time)
print(tuple_time2)

#输出结果:
time.struct_time(tm_year=2019, tm_mon=6, tm_mday=8, tm_hour=10, tm_min=38, tm_sec=42, tm_wday=5, tm_yday=159, tm_isdst=0)  # 元组时间
1559961522.0  # 转化之后的时间戳时间

2 将时间戳转换为元组时间
time.localtime(time1) # 将给出的时间戳时间转化成元组时间
注意:字符时间不能转换成元组时间

import time
time1 = time.time()
print(time1)
tuple_time1 = time.localtime(time1)
print(tuple_time1)

#输出结果: 
1559963672.5279589  # 给出的时间戳
time.struct_time(tm_year=2019, tm_mon=6, tm_mday=8, tm_hour=11, tm_min=14, tm_sec=32, tm_wday=5, tm_yday=159, tm_isdst=0)   # 转换完成的元组时间

3 将时间戳类型转换成为字符串时间
time.ctime(time1) # 将给出的时间戳转化成字符串时间

import time
time1 = time.time()
print(time1)
ctime1 = time.ctime(time1)
print(ctime1)

#输出结果:
1559964353.1933248   # 给出的时间戳时间
Sat Jun  8 11:25:53 2019  # 转化成的字符串时间

4 格式化日期:把元组时间转换成字符串时间
使用 time 模块的 strftime 方法来格式化日期:可以按照想要的格式对日期进行格式化,只需要组合相应的格式化符号即可

格式:time.strftime("%Y-%m-%d %H:%M:%S", 元组时间)
#常用的习惯:年月日之间使用-连接。时分秒之间使用:连接。
符号 代表的意义
%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)
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%T 当前的时分秒:11:47:46
%F 当前的年月日:2019-06-08
import time
time1 = time.localtime()
print(time1)
print(time.strftime("%Y-%m-%d %H:%M:%S", time1))
print(time.strftime( '%B %d %A  %H:%M:%S' ,time1) )
print(time.strftime( '%T' ,time1) )
print(time.strftime( '%F' ,time1) )

#输出结果:
time.struct_time(tm_year=2019, tm_mon=6, tm_mday=8, tm_hour=11, tm_min=45, tm_sec=20, tm_wday=5, tm_yday=159, tm_isdst=0)
2019-06-08 11:45:20
June 08 Saturday  11:45:20
11:47:46
2019-06-08

5 也可以将格式化的时间转换成元组时间。
当给出的格式化时间不能包含元组时间的9个元素的的时候,系统会用默认值补充完整。
格式:time.strptime(时间,时间对应的格式化符号)

import time
s = '2019-6-6'
print(time.strptime(s,'%Y-%m-%d'))
s_time = '09:00:00'
print(time.strptime(s_time,'%H:%M:%S'))

#输出结果:
me(tm_year=2019, tm_mon=6, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=157, tm_isdst=-1)   # 时分秒被默认补充为0
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)  # 年月日被补充为1900-01-01

datetime 模块

使用datetime模块来获取当前的日期和时间

date.today() # 返回当前的日期,2019-06-08
datetime.now() # 返回当前的日期+时间,2019-06-08 12:11:00.127438

timedelta(days=5) # 生成一个时间段对象,使用该对象可以得到该段时间之前之后的时间。

例如:

计算5天前的时间和5天后的时间

from datetime import date
from datetime import timedelta

date_now = date.today()    # 得到当前日期
delta = timedelta(days=5)   # 规定时间间隔
date_befor = date_now - delta  # 得到之前的日期
date_after = date_now + delta  # 得到之后的日期
print(date_now)
print(date_befor)
print(date_after)

#输出结果:
2019-06-08    # 当前日期
2019-06-03    # 五天前日期
2019-06-13    # 五天后日期

计算5个小时前的时间和5个小时后的时间

from datetime import datetime
from datetime import timedelta

date_now = datetime.today()
delta = timedelta(hours=5)
date_befor = date_now - delta
date_after = date_now + delta
print(date_now)
print(date_befor)
print(date_after)

#输出结果:
2019-06-08 12:23:03.757117
2019-06-08 07:23:03.757117
2019-06-08 17:23:03.757117

返回两个时间,想计算两个时间之间的时间差
向需要将两个时间转化成统一的时间形式:
datetime.fromtimestamp(时间戳) # 可以将时间戳转化成一个datetime形式的时间

import os
from datetime import datetime

now_time = datetime.now()
print(now_time)
mtime = os.path.getmtime('/public/lala')
print(mtime)
mtime_obj = datetime.fromtimestamp(mtime)
print(mtime_obj)
delta = now_time - mtime_obj
print(delta)

#输出结果:
1559893876.3027723   # 得到的文件时间戳
2019-06-07 15:51:16.302772  # 将其转化成的datetime形式的时间
20:39:22.953600  # 计算出来的时间差

应用案例_系统监控

需求:
1. 获取当前主机信息, 包含操作系统名, 主机名, 内核版本, 硬件架构等
2. 获取开机时间和开机时长;
3. 获取当前登陆用户

import os
import psutil
from datetime import datetime

print('主机信息'.center(50,'#'))
sys_info = os.uname()
print(
    """
    操作系统:%s
    主机名称:%s
    内核版本:%s
    硬件架构:%s
    """ %(sys_info.sysname,sys_info.nodename,sys_info.release,sys_info.machine)
)
print('开机时间'.center(50,'#'))
boot_time = datetime.fromtimestamp(psutil.boot_time())
now_time = datetime.now()
delta_time = now_time - boot_time
print(
    """
    开机时间:%s
    目前时间:%s
    开机时长:%s
    """ %(boot_time,str(now_time).split('.')[0],str(delta_time).split('.')[0])
)
print('用户信息'.center(50,'#'))
login_user = psutil.users()[0].name
print(login_user)

#输出结果:
#######################主机信息#######################

    操作系统:Linux
    主机名称:foundation47.ilt.example.com
    内核版本:3.10.0-514.el7.x86_64
    硬件架构:x86_64
    
#######################开机时间#######################

    开机时间:2019-06-08 09:35:26
    目前时间:2019-06-08 12:52:07
    开机时长:3:16:41
    
#######################用户信息#######################
kiosk

你可能感兴趣的:(python—时间模块(time模块,datetime模块))