0

0

MySQL时间处理技巧 13位时间戳转日期格式的详细指南

看不見的法師

看不見的法師

发布时间:2025-08-27 09:27:01

|

614人浏览过

|

来源于php中文网

原创

答案:在MySQL中将13位时间戳转换为日期需先除以1000转为秒级,再用FROM_UNIXTIME()函数转换,可结合DATE_FORMAT等函数处理格式,推荐存储UTC时间并在应用层进行时区转换以避免时区问题。

mysql时间处理技巧 13位时间戳转日期格式的详细指南

在MySQL中将13位时间戳转换为日期格式,核心思路是先将毫秒级时间戳转换为秒级(即10位),然后利用MySQL内置的

FROM_UNIXTIME()
函数进行转换。这通常涉及到将13位时间戳除以1000。

解决方案

处理13位时间戳并将其转换为可读的日期格式,其实并不复杂,关键在于理解这多出来的三位数字代表的是毫秒。所以,我们首先需要做的,就是把这些毫秒去掉,让它回归到标准的Unix时间戳(秒级)。

假设你有一个名为

your_table
的表,其中有一个字段
timestamp_ms
存储了13位的时间戳。要将其转换为日期时间格式,你可以这样做:

SELECT
    timestamp_ms,
    FROM_UNIXTIME(timestamp_ms / 1000) AS converted_datetime,
    FROM_UNIXTIME(timestamp_ms / 1000, '%Y-%m-%d %H:%i:%s') AS formatted_datetime
FROM
    your_table;

这里

timestamp_ms / 1000
的作用是将毫秒转换为秒。
FROM_UNIXTIME()
函数默认会返回
'YYYY-MM-DD HH:MM:SS'
格式的日期时间字符串。如果你需要特定的格式,可以传入第二个参数,比如
'%Y-%m-%d %H:%i:%s'
就是常见的年月日时分秒格式。当然,你也可以根据需要调整格式字符串,比如只显示日期
'%Y-%m-%d'
,或者精确到毫秒(虽然
FROM_UNIXTIME
本身不直接支持毫秒,但你可以在应用层做进一步处理)。

实际操作中,如果你只是想在查询时看到这个转换结果,上述方法已经足够。但如果想把这个转换后的日期存储到新的字段,或者更新现有字段,可以结合

ALTER TABLE
UPDATE
语句。比如,添加一个新列并存储转换后的日期:

ALTER TABLE your_table ADD COLUMN created_at DATETIME;
UPDATE your_table SET created_at = FROM_UNIXTIME(timestamp_ms / 1000);

或者,如果你想直接在应用程序中处理,记住这个除以1000的逻辑就行了。很多时候,前端或后端语言在接收到13位时间戳后,也会做类似的处理再传给数据库,或者直接在数据库层完成转换,这取决于具体的系统架构和数据流。

为什么我的时间戳是13位,而不是常见的10位?

这确实是个常见的问题,很多人在处理时间戳时都会遇到这个小小的“惊喜”。简单来说,10位时间戳通常指的是Unix时间戳,它记录的是从1970年1月1日00:00:00 UTC到现在的秒数。而13位时间戳,则是在这个基础上,精确到了毫秒。

为什么会有13位时间戳?这主要是因为不同的系统或编程语言对时间精度的需求和默认实现有所不同。例如,Java中的

System.currentTimeMillis()
函数返回的就是13位的毫秒级时间戳。JavaScript的
Date.now()
new Date().getTime()
也同样返回毫秒级时间戳。这些语言在处理时间时,往往默认提供更高的精度,因为在很多现代应用场景下,秒级的精度已经不够用了,比如需要精确记录事件发生顺序、计算微服务间的延迟等等。

所以,当你看到13位时间戳时,它并非“不标准”或“错误”,它只是一个更精确的时间表示。你不需要为此感到困惑,只要记住它比10位时间戳多了毫秒部分,在需要秒级精度时,简单地除以1000(或者在某些语言中,直接进行类型转换时会自动处理)就可以了。理解这一点,能帮你更好地处理跨系统、跨语言的数据交换,避免不必要的“时间戳之谜”。

在MySQL中,除了FROM_UNIXTIME,还有哪些时间处理函数值得掌握?

MySQL提供了非常丰富的时间和日期处理函数,远不止

FROM_UNIXTIME
一个。掌握这些函数,能让你在数据分析、报表生成、数据清洗等方面事半功倍。

  1. UNIX_TIMESTAMP()
    : 这是
    FROM_UNIXTIME
    的“逆操作”,它将日期时间值转换为Unix时间戳(10位秒级)。

    SELECT UNIX_TIMESTAMP('2023-10-26 10:30:00'); -- 返回一个10位时间戳

    当你需要将MySQL的

    DATETIME
    TIMESTAMP
    字段存储为时间戳,或者进行时间戳比较时,这个函数就派上用场了。

  2. DATE_FORMAT(date, format)
    : 这个函数非常强大,可以将日期或日期时间值格式化成你想要的任何字符串形式。比如,只想要年-月-日,或者只想要时分秒。

    SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H点%i分%s秒'); -- 格式化当前时间

    它的第二个参数是格式字符串,提供了丰富的占位符,比如

    %Y
    代表四位年份,
    %m
    代表月份,
    %d
    代表日期,
    %H
    代表小时(24小时制),
    %i
    代表分钟,
    %s
    代表秒。

  3. STR_TO_DATE(str, format)
    :
    DATE_FORMAT
    的反向操作。它将一个字符串按照指定的格式解析成日期时间值。这在导入数据时特别有用,如果你的日期字符串格式不统一,可以用它来规范化。

    MusicAI
    MusicAI

    AI音乐生成工具

    下载
    SELECT STR_TO_DATE('2023-10-26 10:30:00', '%Y-%m-%d %H:%i:%s');
    SELECT STR_TO_DATE('10/26/2023', '%m/%d/%Y'); -- 处理不同格式的日期字符串
  4. NOW()
    /
    CURDATE()
    /
    CURTIME()
    :

    • NOW()
      : 返回当前的日期和时间(
      YYYY-MM-DD HH:MM:SS
      )。
    • CURDATE()
      : 返回当前日期(
      YYYY-MM-DD
      )。
    • CURTIME()
      : 返回当前时间(
      HH:MM:SS
      )。 这些函数在记录操作时间、设置默认值时非常常用。
  5. DATE_ADD(date, INTERVAL expr unit)
    /
    DATE_SUB(date, INTERVAL expr unit)
    : 这两个函数用于对日期或时间进行加减操作。你可以添加或减去年、月、日、小时、分钟、秒等。

    SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 当前时间加7天
    SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR); -- 当前时间减1小时

    这对于计算未来的截止日期、统计过去某个时间段的数据非常实用。

  6. DATEDIFF(expr1, expr2)
    : 计算两个日期之间的天数差。

    SELECT DATEDIFF('2023-10-31', '2023-10-26'); -- 返回5

    在计算事件持续时间、用户活跃天数等场景下很有用。

掌握这些函数,能让你在MySQL中处理时间数据时更加游刃有余,无论是格式转换、时间计算还是数据分析,都能找到合适的工具

处理MySQL时间戳时,如何避免常见的时区问题?

时区问题在数据库和应用开发中是个老大难,它不像简单的格式转换那样直观,一旦处理不好,数据就可能出现偏差,导致用户体验下降,甚至业务逻辑错误。在MySQL中处理时间戳,尤其需要注意时区的影响。

最常见的误区是,开发者可能认为只要时间戳存进去,取出来就万事大吉了。但实际上,MySQL服务器本身有自己的时区设置,你的应用程序服务器可能有自己的时区,而用户访问时又可能处于另一个时区。这三者如果不同步,就容易出问题。

核心原则:存储UTC时间,在应用层或展示层进行时区转换。

  1. MySQL服务器时区设置:

    • 你可以通过
      SHOW VARIABLES LIKE 'time_zone';
      查看当前MySQL服务器的时区。
    • 通常,我们推荐将服务器时区设置为
      'SYSTEM'
      ,让它跟随操作系统的时区,或者直接设置为
      '+00:00'
      (UTC)。
    • 通过修改
      my.cnf
      my.ini
      文件中的
      default_time_zone = '+00:00'
      来永久设置。
    • 在会话级别,可以使用
      SET time_zone = 'Asia/Shanghai';
      来临时更改当前连接的时区。但这种方式只对当前会话有效,不推荐作为长期解决方案。
  2. TIMESTAMP
    vs
    DATETIME
    数据类型:

    • TIMESTAMP
      列在存储时会自动从当前时区转换为UTC存储,在查询时又从UTC转换为当前会话的时区显示。这听起来很方便,但如果会话时区设置不当,或者跨时区迁移数据时,就可能导致混乱。
    • DATETIME
      列则不进行任何时区转换,它存储的是你插入的精确日期时间值。这使得它在跨时区操作时更“诚实”,但也意味着你需要自己管理时区转换。
    • 我的个人经验是,如果对时区转换有严格控制需求,或者数据需要在全球多个时区使用,优先考虑使用
      DATETIME
      存储UTC时间
      ,然后所有时区转换都在应用程序层面完成。这样数据库只负责存储原始的、无歧义的UTC时间,时区逻辑完全由应用掌控,更清晰。
  3. CONVERT_TZ(dt, from_tz, to_tz)
    函数:

    • 如果你确实需要在MySQL内部进行时区转换,
      CONVERT_TZ
      是你的朋友。
    • 前提是你的MySQL服务器已经加载了时区信息(通常在安装时会加载,或者需要手动执行
      mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
      )。
    • 示例:
      SELECT CONVERT_TZ('2023-10-26 10:00:00', 'America/New_York', 'Asia/Shanghai');
    • 这个函数在生成特定时区报表时非常有用,但日常操作中,还是建议将时区转换逻辑放在应用层,减轻数据库的负担。
  4. 应用程序层面的时区处理:

    • 这是最推荐的做法。当你的应用从MySQL读取UTC时间(无论是
      TIMESTAMP
      自动转换后的,还是
      DATETIME
      存储的UTC),在展示给用户时,根据用户的偏好时区(或者应用默认时区)进行转换。
    • 大多数编程语言都提供了强大的日期时间库来处理时区转换,例如Java的
      java.time
      包,Python的
      pytz
      zoneinfo
      模块,JavaScript的
      Intl.DateTimeFormat
      moment-timezone
    • 这样做的好处是,数据库中的数据始终是统一的UTC时间,方便数据聚合和分析,而用户看到的时间则是符合他们习惯的本地时间,两全其美。

处理时区问题,没有一劳永逸的银弹,但坚持“存储UTC,显示本地”的原则,并理解MySQL中不同数据类型和函数对时区的影响,就能大大降低出错的概率。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

534

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

668

2023.08.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号