百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python时间日期模块使用教程

off999 2025-05-28 19:38 41 浏览 0 评论

1. 时间日期处理概述

在日常编程中,时间日期处理是非常常见的需求,比如:

  • 记录日志时间
  • 计算任务执行时长
  • 定时任务调度
  • 数据分析中的时间序列处理

Python提供了多个模块来处理时间日期,主要包括:

  • time - 提供基础时间功能
  • datetime - 高级日期时间处理
  • calendar - 日历相关功能
  • 第三方库如 arrow, pendulum

2. time模块

2.1 time.time()

原型:

time.time() -> float

功能: 返回当前时间的时间戳(从1970年1月1日00:00:00 UTC开始计算的秒数)

参数: 无

返回值: 浮点数,表示时间戳

应用示例: 计算代码执行时间

import time

start_time = time.time()

# 模拟耗时操作
sum_result = 0
for i in range(1000000):
    sum_result += i

end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行耗时: {execution_time:.4f}秒")

注意事项:

  • 时间戳是相对于UTC时间的
  • 浮点数部分表示微秒级精度

2.2 time.sleep()

原型:

time.sleep(seconds: float) -> None

功能: 让程序暂停指定的秒数

参数:

  • seconds: 暂停的秒数,可以是浮点数表示更精确的时间

返回值: 无

应用示例: 定时任务轮询

import time

def check_status():
    print("检查系统状态...")
    # 模拟状态检查
    return True

while True:
    if check_status():
        print("状态正常,5秒后再次检查")
        time.sleep(5)
    else:
        print("状态异常,立即处理")
        break

注意事项:

  • 实际暂停时间可能略长于指定时间
  • 在GUI程序中慎用,可能导致界面无响应

2.3 time.localtime()

原型:

time.localtime([seconds: float]) -> struct_time

功能: 将时间戳转换为本地时间的struct_time对象

参数:

  • seconds: 可选,时间戳,默认为当前时间

返回值: struct_time对象,包含年月日等时间属性

应用示例: 解析时间戳为可读格式

import time

timestamp = time.time()
local_time = time.localtime(timestamp)

print("当前本地时间结构:")
print(f"年: {local_time.tm_year}")
print(f"月: {local_time.tm_mon}")
print(f"日: {local_time.tm_mday}")
print(f"时: {local_time.tm_hour}")
print(f"分: {local_time.tm_min}")
print(f"秒: {local_time.tm_sec}")
print(f"星期几(0-6): {local_time.tm_wday} (0是周一)")
print(f"一年中的第几天: {local_time.tm_yday}")

struct_time属性表:

属性名

描述

取值范围

tm_year

如2023

tm_mon

1-12

tm_mday

1-31

tm_hour

0-23

tm_min

0-59

tm_sec

0-61(60和61是闰秒)

tm_wday

星期几

0-6(0是周一)

tm_yday

一年中的第几天

1-366

tm_isdst

夏令时标志

-1,0,1

注意事项:

  • struct_time是不可变对象
  • tm_isdst为-1表示不确定,0表示不是夏令时,1表示是夏令时

3. datetime模块

datetime模块提供了更高级的日期时间处理功能,包含以下几个主要类:

3.1 date类

原型:

class datetime.date(year, month, day)

功能: 表示日期(年、月、日),不包含时间

常用方法:

  • today(): 返回当前本地日期
  • fromtimestamp(timestamp): 从时间戳创建date对象
  • strftime(format): 格式化日期为字符串

应用示例: 计算两个日期之间的天数

from datetime import date

# 用户注册日期
register_date = date(2023, 1, 15)
# 当前日期
current_date = date.today()

# 计算使用天数
usage_days = (current_date - register_date).days

print(f"用户已使用服务 {usage_days} 天")

3.2 datetime类

原型:

class datetime.datetime(year, month, day, 
                       hour=0, minute=0, second=0, 
                       microsecond=0, tzinfo=None)

功能: 表示日期和时间,包含年、月、日、时、分、秒、微秒和时区信息

常用方法:

  • now(): 返回当前本地日期时间
  • utcnow(): 返回当前UTC日期时间
  • strftime(format): 格式化日期时间为字符串
  • strptime(string, format): 从字符串解析日期时间

应用示例: 日志时间戳格式化

from datetime import datetime

# 获取当前时间
now = datetime.now()

# 格式化为不同的字符串格式
log_format = now.strftime("%Y-%m-%d %H:%M:%S")
file_format = now.strftime("%Y%m%d_%H%M%S")
human_format = now.strftime("%A, %B %d, %Y %I:%M %p")

print(f"日志格式: {log_format}")
print(f"文件命名格式: {file_format}")
print(f"人类可读格式: {human_format}")

# 从字符串解析
date_str = "2023-07-15 14:30:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"解析后的日期时间: {parsed_date}")

常用格式化代码表:

代码

含义

示例

%Y

4位数年份

2023

%y

2位数年份

23

%m

月份(01-12)

07

%d

日(01-31)

15

%H

24小时制小时(00-23)

14

%I

12小时制小时(01-12)

02

%M

分钟(00-59)

30

%S

秒(00-59)

45

%A

星期全名

Monday

%a

星期缩写

Mon

%B

月份全名

July

%b

月份缩写

Jul

%p

AM/PM

PM

%f

微秒(000000-999999)

123456

3.3 timedelta类

原型:

class datetime.timedelta(days=0, seconds=0, 
                        microseconds=0, milliseconds=0, 
                        minutes=0, hours=0, weeks=0)

功能: 表示时间间隔,用于日期时间的加减运算

应用示例: 计算未来日期和倒计时

from datetime import datetime, timedelta

# 当前时间
now = datetime.now()

# 计算30天后的日期
future_date = now + timedelta(days=30)
print(f"30天后的日期是: {future_date.strftime('%Y-%m-%d')}")

# 活动倒计时
event_date = datetime(2023, 12, 31)
time_left = event_date - now
print(f"距离年底还有: {time_left.days}天 {time_left.seconds//3600}小时")

# 计算工作时间段
start_time = datetime(2023, 7, 15, 9, 0)
end_time = datetime(2023, 7, 15, 18, 30)
work_duration = end_time - start_time
print(f"工作时长: {work_duration.seconds//3600}小时{(work_duration.seconds%3600)//60}分钟")

注意事项:

  • 最大时间单位是天,没有月和年,因为它们的长度不固定
  • 支持负数表示过去的时间

4. calendar模块

calendar模块提供与日历相关的功能,如生成日历、判断闰年等。

4.1 calendar.month()

原型:

calendar.month(year, month, w=0, l=0) -> str

功能: 返回某年某月的日历字符串

参数:

  • year: 年份
  • month: 月份
  • w: 每日宽度,默认为0
  • l: 每周行数,默认为0

应用示例: 生成当月日历

import calendar
from datetime import datetime

now = datetime.now()
year = now.year
month = now.month

# 生成当月日历
cal_str = calendar.month(year, month)
print(f"{year}年{month}月日历:")
print(cal_str)

# 设置更宽的格式
wide_cal = calendar.month(year, month, w=4, l=2)
print("加宽格式:")
print(wide_cal)

4.2 calendar.isleap()

原型:

calendar.isleap(year) -> bool

功能: 判断某年是否为闰年

应用示例: 闰年检查器

import calendar

def check_leap_year(year):
    if calendar.isleap(year):
        print(f"{year}年是闰年")
    else:
        print(f"{year}年不是闰年")

# 测试
check_leap_year(2020)  # 闰年
check_leap_year(2023)  # 平年
check_leap_year(2100)  # 不是闰年(能被100整除但不能被400整除)

5. 时区处理

5.1 pytz库

pytz是处理时区的第三方库,提供了完整的时区数据库。

安装:

pip install pytz

应用示例: 时区转换

from datetime import datetime
import pytz

# 获取当前UTC时间
utc_now = datetime.now(pytz.utc)
print(f"UTC时间: {utc_now}")

# 转换为上海时区
shanghai_tz = pytz.timezone('Asia/Shanghai')
shanghai_time = utc_now.astimezone(shanghai_tz)
print(f"上海时间: {shanghai_time}")

# 转换为纽约时区
new_york_tz = pytz.timezone('America/New_York')
new_york_time = utc_now.astimezone(new_york_tz)
print(f"纽约时间: {new_york_time}")

# 列出所有可用时区
print("\n部分可用时区:")
for tz in list(pytz.all_timezones)[:10]:
    print(tz)

注意事项:

  • 时区处理容易出错,建议始终使用UTC时间存储,只在显示时转换
  • pytz的localize方法用于将原始datetime附加时区信息

6. 第三方库推荐

6.1 arrow库

arrow提供了更人性化的API来处理日期时间。

安装:

pip install arrow

应用示例: 人性化时间处理

import arrow

# 获取当前时间
now = arrow.now()
print(f"当前时间: {now}")

# 人性化显示
print(now.humanize())  # 几秒前

# 时区转换
utc_time = now.to('UTC')
print(f"UTC时间: {utc_time}")

# 时间偏移
tomorrow = now.shift(days=1)
print(f"明天这个时候: {tomorrow}")

# 解析字符串
date_str = "2023-07-15 14:30:00"
parsed = arrow.get(date_str, 'YYYY-MM-DD HH:mm:ss')
print(f"解析后的时间: {parsed}")

# 格式化输出
print(parsed.format('MMMM DD, YYYY hh:mm:ss A'))

6.2 pendulum库

pendulum是另一个优秀的日期时间库,提供了更精确和直观的API。

安装:

pip install pendulum

应用示例: 精确时间计算

import pendulum

# 创建时间对象
dt = pendulum.datetime(2023, 7, 15, tz='Asia/Shanghai')
print(f"创建的时间: {dt}")

# 精确计算
period = dt.diff(pendulum.now())
print(f"时间差: {period.in_words()}")

# 时间加减
new_date = dt.add(years=1, months=2, days=3)
print(f"加1年2月3天后: {new_date}")

# 比较时间
if dt > pendulum.yesterday():
    print("这个时间点在昨天之后")

# 时区转换
ny_time = dt.in_timezone('America/New_York')
print(f"纽约时间: {ny_time}")

# 人性化显示
print(pendulum.now().subtract(days=1).diff_for_humans())  # "1 day ago"

7. 综合应用示例

7.1 任务调度器

from datetime import datetime, timedelta
import time

class TaskScheduler:
    def __init__(self):
        self.tasks = []
    
    def add_task(self, name, interval, func, *args, **kwargs):
        """添加定时任务
        
        Args:
            name: 任务名称
            interval: 执行间隔(秒)
            func: 要执行的函数
            *args: 函数参数
            **kwargs: 函数关键字参数
        """
        next_run = datetime.now() + timedelta(seconds=interval)
        self.tasks.append({
            'name': name,
            'interval': interval,
            'func': func,
            'args': args,
            'kwargs': kwargs,
            'next_run': next_run
        })
    
    def run(self):
        """运行调度器"""
        print("任务调度器启动...")
        try:
            while True:
                now = datetime.now()
                
                for task in self.tasks:
                    if now >= task['next_run']:
                        print(f"执行任务: {task['name']} 时间: {now}")
                        try:
                            task['func'](*task['args'], **task['kwargs'])
                        except Exception as e:
                            print(f"任务 {task['name']} 执行出错: {e}")
                        
                        # 更新下次执行时间
                        task['next_run'] = now + timedelta(seconds=task['interval'])
                
                # 每秒检查一次
                time.sleep(1)
                
        except KeyboardInterrupt:
            print("任务调度器停止")

# 示例任务函数
def print_time(msg):
    print(f"当前时间: {datetime.now()}, 消息: {msg}")

def count_numbers(max_num):
    for i in range(1, max_num + 1):
        print(i, end=' ')
    print()

# 使用示例
if __name__ == "__main__":
    scheduler = TaskScheduler()
    scheduler.add_task("打印时间", 5, print_time, "定时消息")
    scheduler.add_task("计数任务", 10, count_numbers, 5)
    
    scheduler.run()

7.2 生日提醒应用

from datetime import datetime, date
import csv
from pathlib import Path

class BirthdayReminder:
    def __init__(self, data_file="birthdays.csv"):
        self.data_file = Path(data_file)
        self.birthdays = []
        self.load_data()
    
    def load_data(self):
        """加载生日数据"""
        if not self.data_file.exists():
            return
            
        with open(self.data_file, mode='r', encoding='utf-8') as f:
            reader = csv.DictReader(f)
            for row in reader:
                self.birthdays.append({
                    'name': row['name'],
                    'birthday': datetime.strptime(row['birthday'], '%Y-%m-%d').date()
                })
    
    def save_data(self):
        """保存生日数据"""
        with open(self.data_file, mode='w', encoding='utf-8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=['name', 'birthday'])
            writer.writeheader()
            for entry in self.birthdays:
                writer.writerow({
                    'name': entry['name'],
                    'birthday': entry['birthday'].strftime('%Y-%m-%d')
                })
    
    def add_birthday(self, name, birthday):
        """添加生日记录"""
        if isinstance(birthday, str):
            birthday = datetime.strptime(birthday, '%Y-%m-%d').date()
        self.birthdays.append({'name': name, 'birthday': birthday})
        self.save_data()
    
    def get_upcoming_birthdays(self, days=30):
        """获取即将到来的生日"""
        today = date.today()
        upcoming = []
        
        for entry in self.birthdays:
            # 计算今年的生日
            this_year_bday = entry['birthday'].replace(year=today.year)
            
            # 如果今年生日已过,计算明年的
            if this_year_bday < today:
                this_year_bday = this_year_bday.replace(year=today.year + 1)
            
            # 计算距离天数
            delta = (this_year_bday - today).days
            
            if 0 <= delta <= days:
                upcoming.append({
                    'name': entry['name'],
                    'birthday': entry['birthday'],
                    'coming_date': this_year_bday,
                    'days_left': delta
                })
        
        # 按距离天数排序
        upcoming.sort(key=lambda x: x['days_left'])
        return upcoming
    
    def display_upcoming(self, days=30):
        """显示即将到来的生日"""
        upcoming = self.get_upcoming_birthdays(days)
        
        if not upcoming:
            print(f"接下来{days}天内没有生日")
            return
            
        print(f"接下来{days}天内的生日:")
        for entry in upcoming:
            print(f"{entry['name']}: {entry['coming_date'].strftime('%Y-%m-%d')} "
                  f"(还有{entry['days_left']}天, 星期{['一','二','三','四','五','六','日'][entry['coming_date'].weekday()]})")

# 使用示例
if __name__ == "__main__":
    reminder = BirthdayReminder()
    
    # 添加一些示例数据
    if not reminder.birthdays:
        reminder.add_birthday("张三", "1990-05-20")
        reminder.add_birthday("李四", "1985-07-15")
        reminder.add_birthday("王五", "1995-12-31")
    
    # 显示即将到来的生日
    reminder.display_upcoming(60)

8. 注意事项

  1. 时间存储:
  2. 在数据库中始终使用UTC时间存储
  3. 只在显示时转换为本地时间
  4. 时间比较:
  5. 比较时间时确保时区一致
  6. 使用datetime对象比较而非字符串
  7. 性能考虑:
  8. 频繁获取当前时间可能影响性能,必要时可以缓存
  9. 大量时间计算时考虑使用timeit模块测试性能
  10. 错误处理:
  11. 处理无效日期(如2月30日)
  12. 处理时区转换可能出现的异常
  13. 代码可读性:
  14. 使用有意义的变量名如start_time, end_date
  15. 对于复杂的时间计算添加注释

9. 总结

Python提供了丰富的时间日期处理工具,从基础的time模块到高级的datetime模块,再到强大的第三方库如arrowpendulum。选择适合你需求的工具:

  • 简单时间戳和休眠: 使用time模块
  • 常规日期时间处理: 使用datetime模块
  • 复杂时区处理: 使用pytz
  • 更人性化API: 使用arrowpendulum

记住时间日期处理的几个原则:

  1. 明确你的需求(是否需要时间部分,是否需要时区)
  2. 保持一致性(在整个项目中统一时间处理方式)
  3. 考虑性能(对于高频操作)
  4. 注重可读性(使用清晰的变量名和适当的注释)

希望本教程能帮助你掌握Python中的时间日期处理,在实际开发中游刃有余地应对各种时间相关需求!


持续更新Python编程学习日志与技巧,敬请关注!


#编程# #python# #在头条记录我的2025# #分享编程心得#


相关推荐

大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍

“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...

电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器

在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...

设置了加密密码zip文件要如何打开?这几个方法可以试试~

Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...

高效处理 RAR 分卷压缩包:合并解压操作全攻略

在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...

速转!漏洞预警丨压缩软件Winrar目录穿越漏洞

WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...

文件解压方法和工具分享_文件解压工具下载

压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记3

1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...

Python内置tarfile模块:读写 tar 归档文件详解

一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...

使用python展开tar包_python拓展

类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...

银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留

近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...

ZIP文件怎么打开?2个简单方法教你轻松搞定!

在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...

Ubuntu—解压多个zip压缩文件.zip .z01 .z02

方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...

如何使用7-Zip对文件进行加密压缩

7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...

取消回复欢迎 发表评论: