在Python中,通常有这几种方式来表示时间:
时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行type(time.time())
,返回的是float类型。
格式化的时间字符串(Format String)
结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
# 1、时间戳:从1970年到现在经过的秒数
# 作用:用于时间间隔的计算
print(time.time()) # 1598092356.7834184
# 作用:用于展示时间
#struct_time---->格式化的字符串形式的时间
print(time.strftime('%Y-%m-%d %H:%M:%S %p',time.localtime()))) # 2020-08-22 18:32:55 PM
参数为struct_time类型,不传默认为 time.localtime()
print(time.strftime('%Y-%m-%d %X')) # 2020-08-22 18:33:23 (字符串格式)
# 格式化的字符串形式的时间->struct_time
print(time.strptime('2020-10-18','%Y-%m-%d')) #( striing---> struct_time format)得到的是结构化时间,
得到的结果和time.localtime()的格式一致
# 作用:用于单独获取时间的某一部分
# timestemp---->结构化的时间
res=time.localtime() # 结果为为元组(aaa,bbbb)不传默认为time.time()
print(res) # time.struct_time(tm_year=2020, tm_mon=8, tm_mday=22, tm_hour=18,
# tm_min=34, tm_sec=2, tm_wday=5, tm_yday=235, tm_isdst=0)
print(res.tm_year) # 2020
print(res.tm_yday) # 235
# 本地时区和UTC时区
print(time.localtime()) #本地时区的struct_time
# time.struct_time(tm_year=2021, tm_mon=2, tm_mday=15, tm_hour=18, tm_min=7, tm_sec=25, tm_wday=0, tm_yday=46, tm_isdst=0)
print(time.gmtime(333333424.432434,)) #UTC时区的struct_time
# time.struct_time(tm_year=2021, tm_mon=2, tm_mday=15, tm_hour=10, tm_min=7, tm_sec=37, tm_wday=0, tm_yday=46, tm_isdst=0)
相差8小时
三种时间图如下,可以通过结构化时间互相转换
1 #--------------------------按图1转换时间
2 # localtime([secs])
3 # 将一个时间戳转换为当前时区的struct_time,secs参数未提供,则以当前时间为准。
4 time.localtime()
5 time.localtime(1473525444.037215)
6
7 # gmtime([secs]) 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。
8
9 # mktime(t) : 将一个struct_time转化为时间戳。
10 print(time.mktime(time.localtime()))#1473525749.0
11
12
13 # strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和 time.gmtime()返回)转化
为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个
15 # 元素越界,ValueError的错误将会被抛出。
16 print(time.strftime("%Y-%m-%d %X", time.localtime()))#2016-09-11 00:49:56
17
18 # time.strptime(string[, format])
19 # 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
20 print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X'))
21 #time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6,
22 # tm_wday=3, tm_yday=125, tm_isdst=-1)
1 #--------------------------按图2转换时间
2 # asctime([t]) : 把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 1993'。
3 # 如果没有参数,将会将time.localtime()作为参数传入。
4 print(time.asctime())#Sun Sep 11 00:43:43 2016
6 # ctime([secs]) : 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为 None的时候,
将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
8 print(time.ctime()) # Sun Sep 11 00:46:38 2016
9 print(time.ctime(time.time())) # Sun Sep 11 00:46:38 2016
1 #--------------------------其他用法
2 # sleep(secs)
3 # 线程推迟指定的时间运行,单位为秒。
import datetime
# print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
# print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19
# print(datetime.datetime.now() )
# print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
# print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
# print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
# print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
#时间替换
# c_time = datetime.datetime.now()
# print(c_time.replace(minute=3,hour=2)) #时间替换
import datetime
print(datetime.datetime.now()) # 2021-02-15 18:54:42.107243, type为<class 'datetime.datetime'>
# des: 可以修改里面的间隔符号,如 %Y/%m/%d %H:%M:%S 等,格式化输出后type为 'str'类型
result = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 输出结果: 2019-04-04 08:00:00
tmp = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S').split('-')
result1 = '{}年{}月{}日 {}时{}分{}秒'.format(tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5])
# 输出结果:2021年02月15日 18时52分15秒
import datetime
# des: 最后输出type为 'datetime.datetime'
str_time = '2019-04-04 08:00:00'
result = datetime.datetime.strptime(str_time, '%Y-%m-%d %H:%M:%S')
# 输出结果: 2019-04-04 08:00:00
str_time1 = '2019年04月04日 08时00分00秒'
result1 = datetime.datetime.strptime(str_time1, '%Y年%m月%d日 %H时%M分%S秒')
# 输出结果: 2019-04-04 08:00:00
import datetime
start_time = '2019-04-04 08:00:00'
end_time = '2019-04-06 09:00:00'
# 1、字符串转 'datetime.datetime'
start_time = datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
end_time = datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
# 2、做运算
print(end_time-start_time)
# type为 'datetime.timedelta', 输出结果: 2 days, 1:00:00
print((end_time-start_time).seconds)
# type为 'int', 只输出时间秒数差,不输出天数差 输出结果: 3600
print((end_time-start_time).microseconds)
# type为 'int', 只输出时间微妙差,不输出天数差 输出结果: 0
print((end_time-start_time).days)
# type为 'int', 只输出天数差,不输出时间差 输出结果: 2
按照当前时间 +或者- 任意天数后的日期
import datetime
# 获取当前日期时间 2019-04-04 08:00:00
now_date = datetime.datetime.now()
# 获取当前日期 2019-04-04
# now_date = datetime.date.today()
tomorrow_date = now_date + datetime.timedelta(days=1)
# 输出结果: 2019-04-05 08:00:00
yesterday_date = now_date + datetime.timedelta(days=-1)
在python中经常会用到计算两个时间差,两个日期类型进行相减可以获取到时间差。经常会使用seconds来获取,其实seconds获取的是仅仅是时间差的秒数,忽略微秒数,忽略天数。total_seconds()才是获取两个时间之间的总差。
timedalte 是datetime中的一个对象,该对象表示两个时间的差值。构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)其中参数都是可选,默认值为0,其中:
1 minute=1000 millisecond(毫秒)
1 millisecond = 1000 microseconds(微秒)
1 minute = 60 seconds
1 hour = 3600 seconds
1 week = 7 days
在构造函数中,注意参数值的范围:
0 <= microseconds < 1000000
0 <= seconds < 3600*24 (the number of seconds in one day)
-999999999 <= days <= 999999999
timedalte 有三个只读属性:
timedelta.min:负数最大时间差,相当于 timedelta(-999999999)。
timedelta.max:正数最大时间差,相当于 timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)。
timedelta.resolution:两个时间的最小差值 相当于 timedelta(microseconds=1)。
用法:
data_els = []
today_ele =datetime.now().date()
data_els.append(['今天', datetime.now().date()])
data_els.append(['昨天', today_ele - timedelta(days=1)])
data_els.append(['近7天', today_ele - timedelta(days=7)])
data_els.append(['近30天', today_ele - timedelta(days=7)])
selected = " "
for item in data_els:
option_ele = """s" %s>%s """ % (item[1], selected, item[0])
select_ele += option_ele