Python 将时间戳转换为指定格式日期(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

一、前言

在编程领域,时间戳与日期格式的转换是一个基础但极其重要的操作。无论是数据处理、日志记录,还是构建时间相关的应用程序,开发者都需要掌握这一技能。本文将从零开始,详细讲解如何使用 Python 将时间戳(timestamp)转换为指定格式的日期字符串。文章内容涵盖核心概念、代码实现、常见问题及解决方案,适合编程初学者和中级开发者逐步掌握这一知识点。


二、时间戳与日期格式的基础知识

1. 什么是时间戳?

时间戳(Timestamp)是计算机系统用来表示时间的数值,通常表示自 1970 年 1 月 1 日 00:00:00 UTC(称为“Unix 纪元”)到当前时间的总秒数或毫秒数。例如,时间戳 1717020800 表示的是 2024 年 6 月 1 日 00:00:00 UTC 的时间。

比喻理解:可以将时间戳想象为“时间的身份证号码”,它用唯一且连续的数字记录了某个瞬间,但人类无法直接通过数字感知具体日期,因此需要将其转换为可读的格式。

2. 日期格式化的作用

日期格式化(Date Formatting)是指将时间戳或时间对象转换为符合特定需求的字符串形式。例如,将 1717020800 转换为 2024-06-01 00:00:00June 1, 2024。在实际开发中,常见的格式包括:

  • ISO 8601 标准格式YYYY-MM-DD HH:mm:ss
  • 自然语言格式Monday, June 1st, 2024
  • 本地化格式:根据地区习惯调整,如 1/6/2024(美国格式)或 01.06.2024(欧洲格式)

3. Python 中的时间模块

Python 提供了多个内置模块来处理时间相关操作,核心模块包括:

  • time:用于获取当前时间戳、处理本地时间和 UTC 时间。
  • datetime:提供更灵活的日期与时间对象操作,支持格式化和计算。
  • pytz(需安装):用于处理时区转换(非标准库)。

三、Python 中的时间戳转换方法

1. 使用 datetime 模块进行转换

datetime 是 Python 处理日期和时间的“瑞士军刀”,其核心类 datetime.datetime 可以直接从时间戳创建对象,并通过 strftime() 方法格式化输出。

示例 1:基础转换

from datetime import datetime  

timestamp = 1717020800  

dt_object = datetime.fromtimestamp(timestamp)  

formatted_date = dt_object.strftime("%Y-%m-%d %H:%M:%S")  
print(formatted_date)  # 输出:2024-06-01 00:00:00  

示例 2:处理毫秒级时间戳

某些系统(如 JavaScript)返回的毫秒级时间戳需要先转换为秒级:

timestamp_ms = 1717020800000  # 毫秒  
timestamp_sec = timestamp_ms / 1000  
dt_object = datetime.fromtimestamp(timestamp_sec)  
print(dt_object.strftime("%Y-%m-%d %H:%M:%S"))  

2. strftime() 格式化符号详解

strftime() 方法的核心是格式化符号,例如 %Y 表示四位数年份,%m 表示月份。以下是常见符号的总结:

符号描述示例
%Y四位数年份2024
%m月份(01-12)06
%d日期(01-31)01
%H24小时制小时(00-23)00
%M分钟(00-59)00
%S秒(00-60)00
%A完整星期名称Monday
%B完整月份名称June
%pAM/PMAM

比喻理解:格式化符号就像“时间的拼图块”,开发者可以像拼图一样组合不同符号,构建出需要的日期格式。


四、实际案例与代码示例

1. 案例 1:将时间戳转换为自然语言格式

需求:将时间戳 1717020800 转换为 June 1, 2024

from datetime import datetime  

timestamp = 1717020800  
dt = datetime.fromtimestamp(timestamp)  
result = dt.strftime("%B %d, %Y")  
print(result)  # 输出:June 01, 2024  

2. 案例 2:处理时区差异

如果时间戳是 UTC 时间,而需要显示本地时区(例如北京时间+8小时),可以通过 pytz 模块实现:

from datetime import datetime  
import pytz  

timestamp = 1717020800  # UTC 时间戳  
utc_dt = datetime.utcfromtimestamp(timestamp)  

beijing_tz = pytz.timezone("Asia/Shanghai")  
beijing_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(beijing_tz)  

print(beijing_dt.strftime("%Y-%m-%d %H:%M:%S %Z%z"))  

3. 案例 3:处理无效时间戳的异常

时间戳可能因格式错误或逻辑问题导致无效,需用 try-except 捕获异常:

def timestamp_to_date(timestamp):  
    try:  
        dt = datetime.fromtimestamp(timestamp)  
        return dt.strftime("%Y-%m-%d")  
    except OSError:  
        return "无效的时间戳"  

print(timestamp_to_date(1717020800))   # 正常输出  
print(timestamp_to_date(-1000000000)) # 输出:无效的时间戳  

五、常见问题与解决方案

1. 时间戳的单位问题

问题:时间戳可能是秒级或毫秒级,需提前确认单位。
解决

def convert_timestamp(ts, unit="seconds"):  
    if unit == "milliseconds":  
        ts /= 1000  
    return datetime.fromtimestamp(ts)  

2. 不同时区的转换

问题:UTC 时间与本地时间的时差需要手动调整。
解决:使用 pytz 或 Python 3.9+ 内置的 zoneinfo 模块:

from zoneinfo import ZoneInfo  

dt_utc = datetime.fromtimestamp(1717020800, tz=ZoneInfo("UTC"))  
dt_beijing = dt_utc.astimezone(ZoneInfo("Asia/Shanghai"))  

3. 日期格式中缺失的零

问题:如 6月1日 中的 61 未补零。
解决:使用 %m%d 替代 %-m(非跨平台):

print(dt.strftime("%B %-d, %Y"))  # macOS/Linux 支持,Windows 不支持  
day = dt.day  
formatted_day = str(day) if day >= 10 else f"0{day}"  

六、结论

掌握 Python 将时间戳转换为指定格式日期的能力,是开发者处理时间相关任务的基础。通过本文,读者可以:

  1. 理解时间戳与日期格式的核心概念;
  2. 熟练使用 datetime 模块完成基础转换;
  3. 通过 strftime() 格式化符号构建自定义格式;
  4. 处理时区、异常等复杂场景。

未来,随着项目需求的增长,开发者还可以进一步探索 dateutil 等第三方库,或结合数据库、API 的时间处理逻辑。希望本文能成为你 Python 时间处理工具箱中的重要一环!

最新发布