Python小技巧--日期(time、datetime)【分析】

模块

Python处理时间的常用模块为:

  • time 时间的访问和转换
  • datetime 处理日期和时间的类
  • calendar 通用日历相关函数
  • zoneinfo 代表IANA时区数据库的具体时区

在Python中,我们日常常用为前两个模块(Time、Datetime)。
以下介绍中的函数方法只针对日常所用方法来表达,若看详细复杂表达方法可看参考链接。

time – 时间的访问和转换

尽管所有平台皆可使用此模块,但模块内的函数并非所有平台都可用。此模块中定义的大多数函数的实现都是调用其所在平台的C语言库的同名函数。因为这些函数的语义可能因平台而异,所以使用时最好查阅对应平台的相关文档。

时间戳单位最适于做日期运算。通常日期限制在1970至2038年之间。

术语表

术语解释
epoch时间开始的点,取决于平台
UTC 协调世界时(Coordinated Universal Time),格林威治标准时间(GMT)
DST 夏令时(Daylight Saving Time)
指令含意
%a本地化的缩写星期中每日的名称。
%A本地化的星期中每日的完整名称。
%b本地化的月缩写名称。
%B本地化的月完整名称。
%c本地化的适当日期和时间表示。
%d十进制数 [01,31] 表示的月中日。
%f微秒作为一个十进制数,零填充到 6 位。
%H十进制数 [00,23] 表示的小时(24小时制)。
%I十进制数 [01,12] 表示的小时(12小时制)。
%j十进制数 [001,366] 表示的年中日。
%m十进制数 [01,12] 表示的月。
%M十进制数 [00,59] 表示的分钟。
%p本地化的 AM 或 PM 。
%S十进制数 [00,61] 表示的秒。
%U十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周。
%w十进制数 [0(星期日),6] 表示的周中日。
%W十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周。
%x本地化的适当日期表示。
%X本地化的适当时间表示。
%y十进制数 [00,99] 表示的没有世纪的年份。
%Y十进制数表示的带世纪的年份。
%z时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。
%Z时区名称(如果不存在时区,则不包含字符)。已弃用。
%%字面的 '%' 字符。

日常时间元组值 struct_time 术语

索引属性
0tm_year(例如,1993)
1tm_monrange [1, 12]
2tm_mdayrange [1, 31]
3tm_hourrange [0, 23]
4tm_minrange [0, 59]
5tm_secrange [0, 61]
6tm_wdayrange [0, 6] ,周一为 0
7tm_ydayrange [1, 366]
8tm_isdst0, 1 或 -1;
N/Atm_zone时区名称的缩写
N/Atm_gmtoff以秒为单位的UTC以东偏离

tm_isdst 可以在夏令时生效时设置为1,而在夏令时不生效时设置为0。 值-1表示这是未知的,并且通常会导致填写正确的状态。

函数

# 引入time模块
import time  

timeNowTicks = time.time()
"""
返回以浮点数表示的从 epoch 开始的秒数的时间值。
返回值,形如:
1661305619.851781
"""
time.asctime()
"""
将时间元组 time.struct_time 转换为字符串,当元组不存在时(即没有参数时),启用本地时间。
返回值,形如:
Tue Aug 23 10:22:02 2022
"""
time.gmtime()
"""
以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time,返回值,形如:
time.struct_time(tm_year=2022, tm_mon=8, tm_mday=23, tm_hour=10, tm_min=24, tm_sec=48, tm_wday=1, tm_yday=235, tm_isdst=0)
"""
time.localtime()
"""
与 gmtime() 相似但转换为当地时间,
返回值,形如:
time.struct_time(tm_year=2022, tm_mon=8, tm_mday=23, tm_hour=18, tm_min=30, tm_sec=19, tm_wday=1, tm_yday=235, tm_isdst=0)
"""
time.mktime(t)
"""
将时间元组 struct_time 转换为时间戳,结果精确的秒
返回值,形如:
1661221944.0
"""
time.sleep(secs)
"""
调用该方法的线程将被暂停执行 secs 秒。参数可以是浮点数,以表示更为精确的睡眠时长。
由于系统需要调度其他活动,实际暂停时长也可能比请求的时间长。
"""
time.strftime(format[, t])
"""
转换一个元组或 struct_time 表示的由 gmtime() 或 localtime() 返回的时间到由 format 参数指定的字符串。
"""
time.strptime(string[, format])
"""
根据格式解析表示时间的字符串。 返回值为一个被 gmtime() 或 localtime() 返回的 struct_time 。
"""
time.tzname
"""
两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。
日常使用来自 localtime() 结果的 tm_gmtoff 和 tm_zone 来获取时区信息。
"""

常用例子

import time

print(time.time())  # 时间戳
# 1661307904.9684181

print(time.gmtime()) # 格林威治时间/UTC
# time.struct_time(tm_year=2022, tm_mon=8, tm_mday=24, tm_hour=2, tm_min=25, tm_sec=4, tm_wday=2, tm_yday=236, tm_isdst=0)

print(time.localtime()) # 本地时间
print(time.localtime(1661309331.3546288)) # 将时间戳转换为时间元组
# time.struct_time(tm_year=2022, tm_mon=8, tm_mday=24, tm_hour=10, tm_min=25, tm_sec=4, tm_wday=2, tm_yday=236, tm_isdst=0)

print(time.asctime()) # 时间元组转换成字符串时间
print(time.asctime(time.localtime()))
# Wed Aug 24 10:25:04 2022

print(time.mktime(time.localtime())) # 时间元组转换成时间戳
# 1661279104.0

print(time.strftime("%A, %c,%d %B %Y %H:%M:%S +0000, %p", time.localtime())) 
# 具体转换形式可看上面术语表,自行选择定义
# Wednesday, Wed Aug 24 10:48:51 2022,24 August 2022 10:48:51 +0000, AM

print(time.strptime('2022-07-24T10:54:00.000Z', "%Y-%m-%dT%H:%M:%S.%fZ"))
# time.struct_time(tm_year=2022, tm_mon=7, tm_mday=24, tm_hour=10, tm_min=54, tm_sec=0, tm_wday=6, tm_yday=205, tm_isdst=-1)

print(time.tzname)
# ('中国标准时间', '中国夏令时')

print(time.localtime().tm_gmtoff)  # 以秒为单位的UTC以东偏离
# 28800
print(time.localtime().tm_zone) # 时区名称缩写
# 中国标准时间

datetime–处理日期和时间的类

datetime模块提供用于处理日期和时间的类。

日常我们更关注日期时间的运算,以及解析时间属性用于格式化输出和数据操作。

timedelta类对象

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
"""
可用作数学计算 时间
所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,也可以是正数或者负数。
返回值只有 days, seconds 和 microseconds 会存储在内部。 参数单位的换算规则如下:
		1毫秒会转换成1000微秒。
		1分钟会转换成60秒。
        1小时会转换成3600秒。
        1星期会转换成7天。
"""

date对象

对象代表一个理想化历法中的日期(年、月和日),即当今的格列高利历向前后两个方向无限延伸。

datetime.date.fromtimestamp(time.time())
"""
将时间戳转换为本地日期,形如 YYYY-MM-DD 格式
2022-08-24
"""
datetime.date.today()
"""
返回当前的本地日期。
这等价于 date.fromtimestamp(time.time())
"""
datetime.date.fromisoformat(date_string)
"""
只支持 YYYY-MM-DD 格式。
返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象
"""
datetime.date.isoformat()
"""
datetime.date.today().isoformat()
返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
与 datetime.date.fromisoformat 互为逆操作
"""
date.strftime(format)
"""
返回一个由显式格式字符串所指明的代表日期的字符串。
"""

datetime对象

datetime对象是包含来自 date对象和 time对象的所有信息的单一对象。

datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
"""
year, month 和 day 参数是必须的。 tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。
"""
datetime.datetime.today()
"""
返回表示当前地方时的 datetime 对象
"""
datetime.datetime.utcnow()
"""
返回表示当前 UTC 时间的 date 和 time,
"""
datetime.datetime.fromtimestamp()
"""
返回时间戳对应的本地日期和时间
"""
datetime.datetime.utcfromtimestamp()
"""
返回时间戳对应的UTCdatetime
"""

date, datetimetime 对象都支持 strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。

相反地,datetime.strptime()类会根据表示日期和时间的字符串和相应的格式字符串来创建一个 datetime 对象。

time的转换格式指令同样适用于datetime.strptime()和datetime.strftime(),但除非格式中包含秒以下的部分或时区差值信息,它们在 datetime.strptime 中受支持但会被 time.strptime 所丢弃。

常用例子

import datetime

# 结合上述介绍的datetime的三种类方法进行表达
timeUtc = datetime.datetime.utcnow()  # UTC现在时间
# 2022-08-24 06:51:19.013422

timeDelta = datetime.timedelta(seconds=30) # 30秒时间
# 0:00:30
timeDate = timeUtc + timeDelta
# 2022-08-24 06:50:49.013422

timeStr = tiemUtc.strftime("%Y-%m-%dT%H:%M:%S.%fZ") # 将datetime转换为字符串
# 2022-08-24T06:50:49.013422Z

参考链接:
Datetime 基本日期和时间类型
zoneinfo IANA 时区支持
Time 时间的访问和转换
calendar 日历相关函数
Python 日期和时间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事挺秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值