当前位置: 首页 > news >正文

Python Day19 时间模块 和 json模块 及例题分析

一、UUID 模块

用于生成唯一标识符(UUID),常见生成方式及特点:

  • uuid1:基于时间戳和 MAC 地址生成,保证唯一性。
  • uuid3/uuid5:基于命名空间和哈希计算生成,需传入命名空间(如 uuid1 生成的 UUID)和字符串,相同输入生成相同 UUID。
  • uuid4:完全随机生成,随机性强。

示例

import uuid
# uuid1
print(uuid.uuid1())  # 如:a7375a61-6ced-11f0-b5cc-00e04c9c935c(长度36字符)
# uuid3(需命名空间)
namespace = uuid.uuid1()
print(uuid.uuid3(namespace, '12safasdf56'))  # 基于命名空间和字符串生成
# uuid4
print(uuid.uuid4())  # 随机UUID
print(uuid.uuid4().hex)  # 无连字符的16进制形式(32字符)

二、time 模块

用于时间相关操作,核心函数及时间元组:

1. 核心函数
  • sleep(s):程序暂停s秒(单位:秒)。
  • time():返回当前系统时间戳(距离 1970-01-01 08:00:00 的秒数,精确到纳秒)。
  • localtime([timestamp]):返回本地时间元组(默认当前时间,可传入时间戳)。
  • mktime(timetuple):将时间元组转换为对应时间戳。
2. 时间元组

由 9 个元素组成,分别表示:
(年,月,日,时,分,秒,星期,一年中的第几天,是否夏令时)

  • 星期:0 = 周一,1 = 周二,…,6 = 周日。
  • 访问方式:通过索引(如t[0])或属性(如t.tm_year)。

示例

import time
t = time.localtime()  # 当前时间元组
print(t.tm_year)  # 年
print(t.tm_wday)  # 星期(0-6)
print(t.tm_yday)  # 一年中的第几天
3. 时间格式化
  • strftime(format, timetuple):将时间元组格式化为字符串。
  • strptime(string, format):将字符串按格式解析为时间元组。

常用格式符号

  • %Y:四位数年份;%m:两位数月份;%d:两位数日期。
  • %H:24 小时制小时;%M:分钟;%S:秒。
  • %I:12 小时制小时;%p:AM/PM(配合 % I 使用)。

示例

t = time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S', t))  # 如:2025-07-30 15:30:20
# 字符串转时间元组
t_str = "2000年10月20日11点22分33秒"
t_tuple = time.strptime(t_str, "%Y年%m月%d日%H点%M分%S秒")

三、datetime 模块

提供更优雅的日期时间处理,核心类:datetime(日期 + 时间)、date(日期)、time(时间)、timedelta(时间间隔)。

1. datetime 类(日期 + 时间)
  • 创建方式

    • datetime.now():当前时间。
    • datetime(年, 月, 日[, 时, 分, 秒, 微秒]):指定时间(至少需年月日)。
    • datetime.fromtimestamp(timestamp):从时间戳创建。
    • datetime.fromisoformat(iso_str):从 ISO 格式字符串创建(如"2000-10-10 11:21:33.444")。
  • 属性与操作

    • 属性:year, month, day, hour, minute, second, weekday()(0 = 周一)。
    • 转换:timetuple()(转时间元组)、timestamp()(转时间戳)。
    • 格式化:strftime(format)(同 time 模块);strptime(string, format)(解析字符串)。

示例

from datetime import datetime
dt = datetime.now()
print(dt.strftime('%Y/%m/%d %H:%M:%S'))  # 格式化
dt_str = "2000年10月30日11点30分32秒"
dt = datetime.strptime(dt_str, '%Y年%m月%d日%H点%M分%S秒')
2. date 类(仅日期)
  • 创建方式

    • date.today():当前日期。
    • date(年, 月, 日):指定日期。
    • date.fromtimestamp(timestamp):从时间戳创建。
    • date.fromisoformat(iso_str):从 ISO 格式字符串创建(如"2000-10-10")。
  • 属性与操作year, month, day, weekday(),格式化同datetime

示例

from datetime import date
d = date.today()
print(d.strftime('%Y/%m/%d'))  # 2025/07/30
3. time 类(仅时间)
  • 创建方式

    • time(时, 分, 秒[, 微秒]):指定时间。
    • time.fromisoformat(iso_str):从 ISO 格式字符串创建(如"11:20:33.66")。
  • 属性hour, minute, second, microsecond,格式化同datetime

示例

from datetime import time
t = time(11, 22, 33)
print(t.strftime('%H:%M:%S'))  # 11:22:33
4. timedelta 类(时间间隔)

表示一段时间,支持与日期 / 时间对象的加减运算。

  • 创建方式timedelta(days=0, seconds=0, minutes=0, hours=0, weeks=0)

  • 属性

    • days:间隔的总天数。
    • seconds:非整天部分的秒数。
    • total_seconds():总秒数。
  • 运算

    • 日期 / 时间对象 ± timedelta → 新日期 / 时间。
    • 两个日期 / 时间对象相减 → timedelta。

示例

from datetime import datetime, timedelta
now = datetime.now()
# 3天后的时间
three_days_later = now + timedelta(days=3)
# 计算活了多少天
birthday = date(2000, 12, 11)
days_alive = (date.today() - birthday).days

四、copy 模块

用于对象拷贝,区分浅拷贝和深拷贝:

  • 浅拷贝(copy.copy ())

    • 对不可变类型(如 int、str):值拷贝(新对象)。
    • 对可变类型(如 list、dict)及自定义对象:地址拷贝(共享内部引用)。
  • 深拷贝(copy.deepcopy ())

    • 递归拷贝所有元素,可变类型和自定义对象均生成新对象,不共享引用。

示例

import copy
class Dog:def __init__(self, name):self.name = namels = [1, 2, 3, Dog('枯矾')]
shallow = copy.copy(ls)
deep = copy.deepcopy(ls)ls[-1].name = "帕莎"
print(shallow[-1].name)  # 帕莎(浅拷贝共享引用)
print(deep[-1].name)     # 枯矾(深拷贝独立)

五、json 模块

处理 JSON 格式数据(跨语言数据交换),涉及序列化(Python→JSON)和反序列化(JSON→Python)。

1. 数据类型对应关系
PythonJSON
Nonenull
True/Falsetrue/false
int/float数字
str字符串
list/tuple/set数组
dict对象
datetime/date需自定义处理
2. 序列化(dumps/dump)
  • json.dumps(obj, ...):将 Python 对象转为 JSON 字符串。
  • json.dump(obj, fp, ...):将 Python 对象写入文件(JSON 格式)。

关键参数

  • ensure_ascii=False:保留非 ASCII 字符(如中文)。
  • indent=N:设置缩进,格式化输出。
  • default:处理无法序列化的对象(如 datetime),需返回可序列化值。
  • cls:自定义 Encoder 类(继承json.JSONEncoder,重写default方法)。

示例

import json
from datetime import datedata = [{'name': '张三', 'birthday': date(2000, 10, 10)}]# 自定义处理日期
def convert(d):if isinstance(d, date):return d.strftime('%Y/%m/%d')json_str = json.dumps(data, ensure_ascii=False, indent=2, default=convert)
print(json_str)
3. 反序列化(loads/load)
  • json.loads(string):将 JSON 字符串转为 Python 对象。
  • json.load(fp):从文件读取 JSON 并转为 Python 对象。

关键参数

  • object_hook:将 JSON 对象转为自定义类实例(如 User)。

示例

class User:def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderjson_data = '[{"name":"小怪","age":20,"gender":"男"}]'
# 转为User对象列表
users = json.loads(json_data, object_hook=lambda d: User(**d))

一、时间日期计算

1. 获取最近 7 天日期列表

import timedef get_last_week():"""返回最近7天的日期列表,格式为YYYY-MM-DD"""week_days = []current_time = time.time()for i in range(7):day_time = current_time - (24 * 60 * 60 * i)  # 计算前i天的时间戳week_days.append(time.strftime("%Y-%m-%d", time.localtime(day_time)))return week_days
2. 计算两个时间点的时间差

from datetime import datetimedef time_diff(tm1, tm2):"""计算两个时间点的差值,返回格式为'X小时Y分钟Z秒'"""tm1 = datetime.strptime(tm1, "%H:%M:%S")tm2 = datetime.strptime(tm2, "%H:%M:%S")td = abs(tm2 - tm1)  # 时间差total_seconds = td.total_seconds()hours = total_seconds // 3600minutes = (total_seconds % 3600) // 60seconds = total_seconds % 60return f"{hours}小时{minutes}分钟{seconds}秒"
3. 计算两个日期间的星期日列表

from datetime import datetime, timedeltadef sunday_list(tm1, tm2):"""返回两个日期之间所有星期日的日期列表"""tm1 = datetime.strptime(tm1, "%Y-%m-%d")tm2 = datetime.strptime(tm2, "%Y-%m-%d")start, end = min(tm1, tm2), max(tm1, tm2)sundays = []# 找到第一个星期日current = start + timedelta(days=(6 - start.weekday()) % 7)while current < end:sundays.append(current.strftime("%Y-%m-%d"))current += timedelta(days=7)return sundays
4. 计算存活天数

from datetime import datetimedef live_days(birthday: str):"""计算从出生日期到现在的天数"""birth = datetime.strptime(birthday, "%Y-%m-%d").date()now = datetime.now().date()return (now - birth).days
5. 生成随机日期(1900-2100 年)

import random
from datetime import datetime, timedeltadef random_date(start_day="1900-01-01", end_day="2100-12-31"):"""生成指定范围内的随机有效日期"""start = datetime.strptime(start_day, "%Y-%m-%d").date()end = datetime.strptime(end_day, "%Y-%m-%d").date()days_diff = (end - start).daysrandom_days = random.randint(0, days_diff)return (start + timedelta(days=random_days)).strftime("%Y-%m-%d")

二、JSON 序列化与反序列化

1. 普通数据序列化

import jsondata = {"name": "张三","age": 30,"city": "河南郑州","skills": ["Python", "JavaScript", "Data Science"],"is_student": False,(1,): 1  # 元组键会被跳过(非JSON可序列化类型)
}# 序列化(处理中文、跳过不可序列化的键、格式化输出)
json_str = json.dumps(data, ensure_ascii=False, skipkeys=True, indent=2)
print(json_str)
2. 学生对象序列化与反序列化

import json
from datetime import date, datetimeclass Student:def __init__(self, name, age, birth: date):self.name = nameself.age = ageself.birth = birthdef __repr__(self):return f"{self.__class__.__name__}{self.__dict__}"# 自定义序列化函数
def convert_date(obj):if isinstance(obj, (date, datetime)):return obj.strftime('%Y/%m/%d')raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")# 写入文件
def save_students(students, filename="students.json"):with open(filename, "w", encoding="utf-8") as f:json.dump([vars(s) for s in students], f, ensure_ascii=False, indent=2, default=convert_date)# 读取文件并反序列化
def load_students(filename="students.json"):def parse_date(dct):if 'birth' in dct:dct['birth'] = datetime.strptime(dct['birth'], '%Y/%m/%d').date()return Student(**dct)with open(filename, "r", encoding="utf-8") as f:return [parse_date(item) for item in json.load(f)]# 使用示例
if __name__ == "__main__":students = [Student("小魑", 20, date(2004, 2, 5)),Student("小魅", 21, date(2009, 7, 9)),]save_students(students)loaded = load_students()print(loaded)

三、日历显示

from datetime import datedef show_calendar(year, month):"""显示指定年月的日历"""# 获取当月天数if month in [1, 3, 5, 7, 8, 10, 12]:max_day = 31elif month in [4, 6, 9, 11]:max_day = 30else:  # 2月is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)max_day = 29 if is_leap else 28# 计算当月第一天是星期几(0=周一,6=周日)first_day = date(year, month, 1)first_weekday = (first_day.weekday() + 1) % 7  # 转换为0=周日,6=周六# 打印表头print("日\t一\t二\t三\t四\t五\t六")# 打印前导空格print("\t" * first_weekday, end="")# 打印日期for day in range(1, max_day + 1):print(day, end="\t")if (day + first_weekday) % 7 == 0:  # 每周换行print()print()  # 最后换行

四、使用示例

if __name__ == "__main__":# 1. 获取最近7天print("最近7天:", get_last_week())# 2. 计算时间差print("时间差:", time_diff("12:30:00", "14:45:30"))# 3. 星期日列表print("星期日列表:", sunday_list("2023-09-28", "2023-10-10"))# 4. 存活天数print("存活天数:", live_days("2000-01-01"))# 5. 随机日期print("随机日期:", random_date())# 6. 显示日历show_calendar(2025, 7)

 

http://www.dtcms.com/a/307022.html

相关文章:

  • Dify案例2:基于Workflow的小红书笔记AI智能体以及AI绘图过程中遇到的问题
  • USRP捕获手机/路由器数据传输信号波形(上)
  • Vue面试
  • HTML基础P2 | JS基础讲解
  • 《汇编语言:基于X86处理器》第10章 复习题和练习
  • HTTPS基本工作过程:基本加密过程
  • 谈谈毕业工作一年后的变化
  • c#_文件的读写 IO
  • 关系型数据库架构最优选择:基于落霞归雁思维框架的分析
  • 7月30日作业
  • Spring Boot 数据源配置中为什么可以不用写 driver-class-name
  • 第六章第一节 TIM 定时中断
  • vue2中的过滤器filter
  • 1+1>2!特征融合如何让目标检测更懂 “场景”?
  • 深入理解数据库事务:从概念到实践
  • 防止飞书重复回调通知分布式锁
  • 白话容器基础(一):进程
  • Mybatis分页查询当前页数据条数大于实际返回的数据条数
  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • Matplotlib(四)- 图表样式美化
  • Linux日志管理和时钟同步配置指南
  • OneCode3.0 框架深入研究与应用扩展
  • html页面跳转或者a标签锚点跳转,解决页面滚动问题3个(1.从底部开始滚动,2.滚动不到指定锚点位置,3.页面展示不在最上面)
  • MySQL图解索引篇(2)
  • 斯皮尔曼spearman相关系数
  • 25年新算法!基于猛禽的优化算法(BPBO):一种元启发式优化算法,附完整免费MATLAB代码
  • Java反射-动态代理
  • cmake_parse_arguments()构建清晰灵活的 CMake 函数接口
  • 智汇AI,应用领航 | 华宇万象问数入选2025全景赋能典型案例
  • 36、spark-measure 源码修改用于数据质量监控