4. python time和datetime模块

 


4. python time和datetime模块

time()

1. 模块概述

time 模块主要处理以下内容:

  • 时间戳(Timestamp):从1970年1月1日00:00:00 UTC开始的秒数(浮点数)。
  • 结构化时间(struct_time):由9个字段组成的元组,表示时间的各个部分(年、月、日等)。
  • 格式化时间字符串:如 "2023-10-01 12:30:45"

2. 常用函数

(1) 获取时间

  • time.time()
    返回当前时间的时间戳(浮点数)。

    import time
    timestamp = time.time()  # 示例输出:1696141200.123456
    
  • time.ctime([secs])
    将时间戳转换为可读的本地时间字符串。若未提供参数,默认使用当前时间。

    time_str = time.ctime()  # 输出:'Sat Oct  1 12:30:45 2023'
    
  • time.gmtime([secs])
    将时间戳转换为UTC时区的 struct_time 对象。默认使用当前时间。

    utc_time = time.gmtime()
    
  • time.localtime([secs])
    将时间戳转换为本地时区的 struct_time 对象。默认使用当前时间。

    local_time = time.localtime()
    

(2) 程序休眠

  • time.sleep(secs)
    暂停程序执行 secs 秒(可以是浮点数)。

    time.sleep(2.5)  # 休眠2.5秒
    

(3) 时间格式转换

  • time.mktime(t)
    将本地时间的 struct_time 转换为时间戳。

    timestamp = time.mktime(local_time)
    
  • time.strftime(format[, t])
    struct_time 转换为格式化的字符串。若未提供 t,默认使用 localtime()

    formatted = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
    # 示例输出:'2023-10-01 12:30:45'
    
  • time.strptime(string, format)
    将格式化字符串解析为 struct_time

    parsed_time = time.strptime("2023-10-01", "%Y-%m-%d")
    

(4) 性能计时

  • time.perf_counter()
    返回高精度的性能计时器值(包含睡眠时间),用于测量代码执行时间。

    start = time.perf_counter()
    # 执行代码...
    end = time.perf_counter()
    print(f"耗时:{end - start}秒")
    
  • time.process_time()
    返回当前进程的CPU时间(不包含睡眠时间),用于分析CPU使用率。


3. struct_time 结构

struct_time 是一个包含9个字段的元组:

索引 属性 描述 取值范围
0 tm_year 年份(如2023) 正整数
1 tm_mon 月份 1-12
2 tm_mday 1-31
3 tm_hour 小时 0-23
4 tm_min 分钟 0-59
5 tm_sec 0-61(闰秒)
6 tm_wday 星期几(0=周一) 0-6
7 tm_yday 一年中的第几天 1-366
8 tm_isdst 夏令时标志(0/1/-1) -1(未知)

4. 时间格式化符号

strftimestrptime 中使用的常见格式指令:

符号 说明 示例
%Y 年份(4位数) 2023
%m 月份(01-12) 10
%d 日(01-31) 01
%H 小时(00-23) 14
%M 分钟(00-59) 30
%S 秒(00-59) 45
%A 完整的星期名称 Monday
%a 简写的星期名称 Mon
%B 完整的月份名称 October
%b 简写的月份名称 Oct
%p AM/PM AM
%Z 时区名称 UTC

5. 示例代码

(1) 获取并格式化当前时间

import time

now = time.localtime()
formatted = time.strftime("%Y-%m-%d %H:%M:%S", now)
print(formatted)  # 输出:2023-10-01 12:30:45

(2) 计算代码执行时间

start = time.perf_counter()
time.sleep(1)
end = time.perf_counter()
print(f"耗时:{end - start}秒")  # 输出:1.000123秒

(3) 解析时间字符串

time_str = "2023-10-01"
parsed = time.strptime(time_str, "%Y-%m-%d")
print(parsed.tm_year)  # 输出:2023

6. 注意事项

  1. 时区问题gmtime() 返回UTC时间,localtime() 返回本地时间。
  2. 时间戳精度time.time() 在Windows系统下精度较低(约0.001秒),而 time.perf_counter() 提供更高精度。
  3. 夏令时处理tm_isdst 字段可能影响本地时间的转换。

通过掌握这些内容,可以高效地使用 time 模块处理各种时间相关任务。

datetime()

1. 模块概述

datetime 模块包含以下主要类:

  • datetime.date:处理日期(年、月、日)。
  • datetime.time:处理时间(时、分、秒、微秒)。
  • datetime.datetime:日期和时间的组合(最常用)。
  • datetime.timedelta:表示时间间隔(如天、秒、微秒)。
  • datetime.tzinfo:时区信息的基类(需自定义或使用第三方库如 pytz)。

2. 常用类及方法

(1) datetime.date

  • 创建日期对象

    from datetime import date
    d = date(2023, 10, 1)  # 年、月、日
    
  • 常用属性和方法

    print(d.year)     # 2023
    print(d.month)    # 10
    print(d.day)      # 1
    print(d.weekday())   # 返回星期几(0=周一,6=周日)
    print(d.isoformat()) # 返回ISO格式字符串 "2023-10-01"
    

(2) datetime.time

  • 创建时间对象

    from datetime import time
    t = time(12, 30, 45)  # 时、分、秒、微秒(可选)
    
  • 常用属性和方法

    print(t.hour)    # 12
    print(t.minute)  # 30
    print(t.second)  # 45
    print(t.isoformat()) # "12:30:45"
    

(3) datetime.datetime(最常用)

  • 创建日期时间对象

    from datetime import datetime
    dt = datetime(2023, 10, 1, 12, 30, 45)  # 年、月、日、时、分、秒
    
  • 常用方法

    • 获取当前时间

      now = datetime.now()  # 本地当前时间
      utc_now = datetime.utcnow()  # UTC当前时间
      
    • 日期时间拆分

      print(now.year, now.month, now.day)
      print(now.hour, now.minute, now.second)
      
    • 转换为时间戳

      timestamp = now.timestamp()  # 返回浮点型时间戳
      
    • 从时间戳创建

      dt = datetime.fromtimestamp(1696141200.0)  # 本地时间
      dt_utc = datetime.utcfromtimestamp(1696141200.0)  # UTC时间
      
    • 格式化输出

      formatted = now.strftime("%Y-%m-%d %H:%M:%S")  # "2023-10-01 12:30:45"
      
    • 解析字符串

      parsed = datetime.strptime("2023-10-01 12:30", "%Y-%m-%d %H:%M")
      

(4) datetime.timedelta

表示时间间隔,用于日期时间的加减:

from datetime import datetime, timedelta

now = datetime.now()
# 加减时间
future = now + timedelta(days=3, hours=2)  # 3天2小时后
past = now - timedelta(weeks=1)            # 1周前

# 计算时间差
diff = future - past
print(diff.days)      # 10(天数差)
print(diff.seconds)   # 7200(秒数差,2小时=7200秒)

3. 时区处理

Python内置的 datetime.timezone 类(Python 3.2+)支持简单时区操作,但更复杂的时区需使用第三方库 pytz

(1) 使用 datetime.timezone

from datetime import datetime, timezone, timedelta

# 创建带时区的日期时间
utc_time = datetime.now(timezone.utc)  # UTC时间
# 自定义时区(东八区)
tz = timezone(timedelta(hours=8))
local_time = datetime.now(tz)

(2) 使用 pytz(推荐)

安装:pip install pytz

import pytz
from datetime import datetime

# 创建带时区的日期时间
tz_shanghai = pytz.timezone('Asia/Shanghai')
dt = datetime.now(tz_shanghai)

# 时区转换
utc_dt = dt.astimezone(pytz.utc)  # 转换为UTC时间

4. 时间格式化符号

time 模块类似,常用符号如下:

符号 说明 示例
%Y 4位年份 2023
%m 月份(01-12) 10
%d 日(01-31) 01
%H 小时(00-23) 14
%M 分钟(00-59) 30
%S 秒(00-59) 45
%f 微秒(000000-999999) 123456
%A 完整星期名 Monday
%a 简写星期名 Mon
%B 完整月份名 October
%b 简写月份名 Oct
%z 时区偏移(+HHMM/-HHMM) +0800
%Z 时区名称 CST

5. 示例代码

(1) 计算两个日期的差值

from datetime import datetime

date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 10)
delta = date2 - date1
print(delta.days)  # 输出:9

(2) 生成最近一周的日期列表

from datetime import datetime, timedelta

now = datetime.now()
dates = [now - timedelta(days=i) for i in range(7)]
for d in dates:
    print(d.strftime("%Y-%m-%d"))

(3) 带时区的时间转换

import pytz
from datetime import datetime

# 创建上海时区时间
tz_sh = pytz.timezone('Asia/Shanghai')
dt_sh = datetime.now(tz_sh)
print(dt_sh.isoformat())  # 输出:2023-10-01T14:30:45+08:00

# 转换为纽约时区
tz_ny = pytz.timezone('America/New_York')
dt_ny = dt_sh.astimezone(tz_ny)
print(dt_ny.isoformat())  # 输出:2023-10-01T02:30:45-04:00

6. 注意事项

  1. 时区处理:默认的 datetime 对象是“无时区”的(naive),建议始终使用带时区的对象(aware)。
  2. 性能:频繁的日期计算推荐使用 timedelta,避免循环中重复创建对象。
  3. 月份和日期范围:如 date(2023, 2, 30) 会抛出 ValueError(2月无30日)。
  4. 第三方库:处理复杂时区时,优先使用 pytz 而非内置模块。

7. 总结

  • datetime vs time模块
    • datetime 更适合日期时间的复杂操作(如时区、时间差)。
    • time 模块更底层,适合处理时间戳和简单休眠。
  • 核心操作
    • 日期时间创建、格式化、解析。
    • 时间差计算(timedelta)。
    • 时区转换(结合 pytz)。

掌握 datetime 模块后,可以高效处理大多数日期时间相关的业务需求。

posted @   逃离这世界~  阅读(58)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航