日期和时间(Python)


时间间隔是以秒为单位的浮点小数。
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元组具体属性
字段属性
04位数年2008tm_year2008
11 到 12tm_mon1 到 12
21 到 31tm_mday1 到 31
3小时0 到 23tm_hour0 到 23
4分钟0 到 59tm_min0 到 59
50到61 (60或61 是闰秒)tm_sec0到61 (60或61 是闰秒)
6一周的第几日0到6 (0是周一)tm_wday0到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])

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值