时间间隔是以秒为单位的浮点小数。
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp),是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z
时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。
一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。
很多Python函数用一个元组装起来的9组数字处理时间:
序号 | struct_time元组 | 具体属性 | ||
---|---|---|---|---|
字段 | 值 | 属性 | 值 | |
0 | 4位数年 | 2008 | tm_year | 2008 |
1 | 月 | 1 到 12 | tm_mon | 1 到 12 |
2 | 日 | 1 到 31 | tm_mday | 1 到 31 |
3 | 小时 | 0 到 23 | tm_hour | 0 到 23 |
4 | 分钟 | 0 到 59 | tm_min | 0 到 59 |
5 | 秒 | 0到61 (60或61 是闰秒) | tm_sec | 0到61 (60或61 是闰秒) |
6 | 一周的第几日 | 0到6 (0是周一) | tm_wday | 0到6 (0是周一) |
7 | 一年的第几日 | 1到366 (儒略历) | tm_yday | 一年中的第几天,1 到 366 |
8 | 夏令时 | -1, 0, 1, -1是决定是否为夏令时的旗帜 | tm_isdst | 是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1 |
获取时间
import time
import datetime
from datetime import date
# (1)当前时间戳
# 1628055167.7581928
timeStamp1=time.time()
# 1628055167.0 返回的时间戳只精确到整数
timeStamp2 = time.mktime(datetime.datetime.now().timetuple())
# (2)当前格式化时间
# 2021-08-04 13:28:28.873697
now=datetime.datetime.now()
# 2021-08-04 13:28:28.873697
today=datetime.datetime.today()
'''
嫌输出样式不好看的看这:
print(f"{today:%Y-%m-%d}")
输出结果: 2021-08-04
print(f"{today:%Y-%m-%d %H:%M:%S}")
输出结果: 2021-08-04 13:28:28
Time1 = now.strftime("%Y-%m-%d %H:%M:%S")
输出结果: 2021-08-04 13:28:28
Time2 =now.strftime("%y-%m-%d. %Y %b %d is a %A on the %d day of %B.")
输出结果: 21-08-04. 2021 Aug 04 is a Wednesday on the 04 day of August.
错误语法:strftime("%Y-%m-%d %H:%M:%S",now)
只有日期,没有时间:
a = datetime.date.today()
b = date.today()
输出结果都是:2021-08-04
'''
# (3)当前可视化时间
# Wed Aug 4 14:09:10 2021(翻译一下:周二 八月四号 14点9分10秒 2021年)
t1=time.asctime()
# Wed Aug 4 14:09:10 2021
t2=time.ctime()
# (4)时间元组
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=13, tm_min=30, tm_sec=11, tm_wday=2, tm_yday=216, tm_isdst=0)
a=time.localtime()
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=13, tm_min=35, tm_sec=41, tm_wday=2, tm_yday=216, tm_isdst=-1)
b=time.localtime(time.time())
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=13, tm_min=35, tm_sec=41, tm_wday=2, tm_yday=216, tm_isdst=-1)
c=datetime.datetime.now().timetuple()
转换
"""
时间元组(年、月、日、时、分、秒、一周的第几日、一年的第几日、夏令时)
一周的第几日: 0-6
一年的第几日: 1-366
夏令时: -1, 0, 1
python中时间日期格式化符号:
------------------------------------
%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 当前时区的名称 # 乱码
%% %号本身
"""
时间戳
import time
import datetime
# (1)时间戳 → 时间元组,默认为当前时间
# 语法:time.localtime(时间戳)
# 另一种方式是:time.gmtime(时间戳),但他返回的是格林威治时间下的时间元组,比北京时间少八小时。所以一般不用
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=13, tm_min=56, tm_sec=24, tm_wday=2, tm_yday=216, tm_isdst=0)
y1=time.localtime(time.time())
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=5, tm_hour=17, tm_min=42, tm_sec=8, tm_wday=3, tm_yday=217, tm_isdst=0)
y2=time.localtime(1628156528.226226)
# (2)时间戳 → 可视化时间
# 语法:time.ctime(时间戳)
# Thu Aug 5 17:42:08 2021
t=time.ctime(1628156528.226226)
# (3)时间戳 → 格式化时间
# 语法:datetime.datetime.fromtimestamp(时间戳)
# 语法:datetime.datetime.utcfromtimestamp(时间戳),这转换的是格林威治时间,比北京时间少八小时。所以要用的话要做个加法
# 2021-08-05 17:42:08.226226
t1 = datetime.datetime.fromtimestamp(1628156528.226226)
# 2021-08-05 17:42:08.226226
t2 = datetime.datetime.utcfromtimestamp(1628156528.226226+3600*8)
# 2021-08-05 09:42:08.226226
t3 = datetime.datetime.utcfromtimestamp(1628156528.226226)
格式化时间
import time
#(1)格式化时间 → 时间元祖
# 语法:time.strptime("时间字符串", "时间格式")
# time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=15, tm_min=32, tm_sec=23, tm_wday=2, tm_yday=216, tm_isdst=-1)
y=time.strptime('2021-08-04 15:32:23', '%Y-%m-%d %H:%M:%S')
#(2)格式化时间 → 时间戳
# 语法:time.mktime(time.strptime("时间字符串", "时间格式"))。先转元组再转为时间戳
# 1628060904.0
timeStamp3=time.mktime(time.strptime('2021-08-04 15:08:24', '%Y-%m-%d %H:%M:%S'))
可视化时间
# (1)可视化时间 → 时间戳
# 语法:语法:time.mktime(time.strptime("可视化时间", "时间格式"))。先转元组再转为时间戳
# 1628060904.0
a = "2021 Aug 4 Wed 15:08:24"
timeStamp1=time.mktime(time.strptime(a, "%Y %b %d %a %H:%M:%S"))
# 1628060924.0
timeStamp2=time.mktime(time.strptime("Wednesday August 4 15:08:44 2021","%A %B %d %H:%M:%S %Y"))
时间元组
import time
# (1)时间元组 → 时间戳
# 语法:time.mktime(时间戳)
# 1628057071.0
c1=time.mktime((2021, 8, 4, 14, 4, 31, 6, 273, 0))
# 1628057052.0
c2=time.mktime(time.localtime())
# (2)时间元组 → 格式化时间
# 语法:time.strftime("时间格式", 时间元组)
# 2021-08-04 14:20:49
s1=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 2021/08/04 14:20:49
s2=time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
# (3)时间元组 → 可视化时间
# 语法:time.asctime(时间元组)
# Sun Aug 4 14:12:06 2021
t1=time.asctime((2021, 8, 4, 14, 12, 6, 6, 273, 0))
# Wed Aug 4 14:12:51 2021
t2=time.asctime(time.localtime())
# 语法:time.strftime("时间格式",时间元组)
# Wed Aug 04 14:52:20 2021
t3=time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
差不多就整理到这了,其他的转换都需要找一个第三者来充当媒介,以求得最终结果。
实例
时间之间的任意转换:
import time
t = "2021/8/4 16:04:24"
# 先转换为时间数组,然后转换为其他格式
timeArray = time.strptime(t, "%Y/%m/%d %H:%M:%S")
otherStyleTime = time.strftime("%Y %b %d %a %H:%M:%S", timeArray)
print(otherStyleTime)
#输出结果: 2021 Aug 04 Wed 16:04:24
输出某一月的日历:
import calendar
cal = calendar.month(2021, 8)
print("以下输出2021年8月份的日历:")
print(cal)
# 输出结果:
'''
以下输出2021年8月份的日历:
August 2021
Mo Tu We Th Fr Sa Su
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
'''
计算三天前的日期:
import datetime
# 计算三天前的日期
# jintian=datetime.datetime.today() datetime.date.today()只到日期,没有时间
jintian=datetime.datetime.now()
# 如果是-3,则计算三天后的日期
santianqian=datetime.timedelta(days=3)
threeDayAgo = (jintian - santianqian)
# 转换为其他字符串格式
otherStyleTime = threeDayAgo.strftime("%Y/%m/%d %H:%M:%S")
print(threeDayAgo)
print(otherStyleTime)
# 输出结果:
# 2021-08-01 16:15:23.577605
# 2021/08/01 16:15:23
计算任意日期之间的差值:
from datetime import date
birthday1 = date(1998, 6, 18)
birthday2 = date(2021, 8, 4)
age = birthday2 - birthday1
# 算头不算尾,算尾不计头。
# 在同一个月相减,就是日期的差,不在同一月结果就不明显了
# 例如:
# 八月四日 减 八月一日 结果是 3
# 在同一年,十月一 减 七月一等于92。明年七一 减 今年七一等于365
a=age.days
print(birthday1)
print(birthday2)
print(age)
print(a)
'''
输出结果:
1998-06-18
2021-08-04
8448 days, 0:00:00
8448
'''
生成一个时间字符串:20210804144412(精确到秒)或20210804144412834347(精确到微秒)
import time
import datetime
# 输出时间戳
print(time.time())
# 2021-08-04 14:44:12.834347 等价语句 now_1 = datetime.datetime.fromtimestamp(time.time())
now=datetime.datetime.now()
# 得到时间的数字串,精确到秒 20210804144412
t1 = now.strftime("%Y%m%d%H%M%S")
# 得到时间的数字串,精确到微秒 20210804144412@834347
print(t1+'@'+str(now)[-6:])
print(t1+'@'+str(now).split('.')[1])