本文章需要的使用到time模块,故先从time模块和datetime模块讲起.
python之time模块
需要注意的是在time模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 – 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用另一个Python时间模块,datetime模块更好
time模块中时间表现的三种格式
- 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。返回的是flot类型的数字。产生时间戳方式的函数主要有time(),clock()等。
- 格式化的时间字符串(Format String)
- 结构化的时间(struct_time):struct_time是一个元组类型,共有9个元素共九个元素(见下表),而gmtime(),localtime(),strptime()这几个函数返回的都是struct_time类型
其中struct_time的主要元素如下,元素值可以通过索引和属性名直接获取
index | Attribute | Values |
---|---|---|
0 | tm_year(4位数年) | (for example, 1993) |
1 | tm_mon(月) | range [1, 12] |
2 | tm_mday(日) | range [1, 31] |
3 | tm_hour(小时) | range [0,23] |
4 | ttm_min(分钟) | range [0, 59] |
5 | tm_wday (一周第几天) | range [0, 6], Monday is 0 |
6 | tm_yday(一年第几天) | range [1, 366] |
import time
print(time.gmtime())
print(time.localtime())
print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X'))
# 输出如下:
# time.struct_time(tm_year=2019, tm_mon=10, tm_mday=24, tm_hour=11, tm_min=53, tm_sec=8, tm_wday=3, tm_yday=297, tm_isdst=0)
# time.struct_time(tm_year=2019, tm_mon=10, tm_mday=24, tm_hour=19, tm_min=53, tm_sec=8, tm_wday=3, tm_yday=297, tm_isdst=0)
# time.struct_time(tm_year=2019, tm_mon=10, tm_mday=24, tm_hour=19, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=297, tm_isdst=-1)
-
time() 返回当前时间的一个时间戳。
-
sleep() 线程将推迟指定的时间后运行,单位为秒。其精度为亚秒级。
-
ctime() 将一个时间戳(默认为当前时间)转换成一个时间字符串。
-
localtime() 将一个时间戳转化为当前地区的一个struct_time()类型元组,未设置默认为当前时间。
-
gmtime() gmtime()与localtime类似,不过返回的UTC世界标准时间。
-
mktime() 将一个strut_time 转化为时间戳。
-
clock() 返回的是程序进程运行时间。
-
asctime() 把一个代表时间的元组或者struct_time类型元组,转换为类似Thu Mar 21 15:05:36 2019这样的形式。
-
strptime(‘2011-05-05 16:37:06’, ‘%Y-%m-%d %X’) 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
-
strftime(’%Y-%m-%d %X’, (2009, 2, 17, 17, 3, 38, 1, 48, 0)) 把一个代表时间的元组或者struct_time类型元组转化为格式化的时间字符串。
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
# 结果:
# 2019-10-24 20:01:08
python之datetime模块
datetime.datetime类
-
datetime.datetime.now():返回系统当前时间
-
datetime.datetime.now().date():返回当前时间的日期
-
datetime.datetime.now().time():返回当前时间的时分秒
-
datetime.datetime.ctime():将datetime.datetime类型转化成str类型
import datetime
print(datetime.datetime.now())
print(datetime.datetime.now().date())
print(datetime.datetime.now().time())
print(datetime.datetime.now().ctime())
'''
2019-10-24 20:18:15.144694
2019-10-24
20:18:15.144694
Thu Oct 24 20:18:15 2019
'''
接下来我便利用四位生日推测出身份证号码
我们可以先生成某年份的所有日期(例如1995年)
import time
# 生成出生当年所有日期
def dateRange(year):
format = '%Y-%m-%d'
# 将格式化的字符串时间转化为struct_time再转化成时间戳
begin = int(time.mktime(time.strptime(year+'-01-01',format)))
end = int(time.mktime(time.strptime(year+'-12-31',format)))
# 将时间戳转化成struct_time再转化成格式化字符串时间
list_date = [time.strftime(format,time.localtime(i)) for i in range(begin,end+1,3600*24)]
return [i.replace('-','') for i in list_date]
data_time = dateRange('1995')
print(data_time)
我们利用 id-validator 来依次校验刚才生成的身份证号码
from id_validator import validato
#遍历所有日期,print通过校验的身份证号码
def vali_dator(id1,id2,id3):
for i in dateRange(id2):
theid = id1 + i + id3
if validator.is_valid(theid):
print(theid)
vali_dator('532301','1995','1512')