Command Palette

Search for a command to run...

Unix 时间戳转换器:Epochs、Timezones 和 Year-57123 Bug

Unix 时间戳转换器:Epochs、Timezones 和 Year-57123 Bug

T
Toolz Team
|Jul 3, 2026|14 最小读数

其他工具 合集的一部分

我的一个 Laravel SaaS 应用程序的用户曾经通过电子邮件表示,他的订阅续订日期看起来很慷慨。 "账单页面告诉他,他的计划将于今年 4 月 25 日续订 第57123章

Bug,我尴尬地渴望找到,因为每一个单独的片段都是正确的。React前端发送 Date.now()- 返回 毫秒- PHP 后端做到了 date('Y-m-d', $timestamp)的,这就期望 .饲料 1740470400000 成期待的函数 1740470400 and you land 大概55000年后的未来,无一例外,无警告,无失败测试,只是一个客户礼貌地问他的订阅是否真的持续到文明的热死。

Timestamps看起来像是软件中最无聊的话题,他们're实际上是我们拥有的最可靠的错误工厂之一:秒与毫秒,UTC与本地,DST过渡,2038年翻车 时间戳转换器 在toolz。dev上存在是因为我厌倦了这样做 new Date(x * 1000) 1天四十次的浏览器控制台里,这个指南涵盖了我现在检查的内容,按照我检查的顺序。

TL;博士: Unix 时间戳自 1970 年 1 月 1 日起计算秒数 UTC 时间:00:00。 10位数 = 秒,13位数 = 毫秒- 将它们混合起来可以让您的日期缩短 55,000 年。存储 UTC、仅转换以供显示、使用 IANA 区域名称(例如) Asia/Dhaka 而不是缩写。将任何时间戳粘贴到 时间戳转换器 要获取 ISO 8601、RFC 2822、本地和 UTC 表单 - 它运行客户端,因此时间戳会退出 JWT 生产日志永远不会离开您的浏览器。


什么是 Unix 时间戳?

Unix 时间戳(历元时间、POSIX 时间)是此后经过的秒数 1970年1月1日,世界标准时间00:00:00- "Unix epoch。" It's 是一个整数,它没有时区(根据定义,it's 始终为 UTC),并且实际上每个操作系统、语言和数据库都理解它。最后一个属性是它存活了五十年的原因:这是没有人争论的一次性格式。

1970年为什么?没有深层的原因- 在贝尔实验室建造Unix的时候附近,这是一个方便的轮次日期,早期的Unix以32位整数计算时间,任意选择化石化为一个通用标准,这是非常Unix的。

一些值得一看就认同的参考点:

时间戳 UTC 日期 为什么你'd看到
0 1970-01-01 00:00:00 时代。还有你从中得到的 null/0 bugs-屏幕上的1970年日期几乎总是意味着一个未初始化的值,而不是时间旅行
946684800 2000-01-01 00:00:00 Y2K
1234567890 2009-02-13 23:31:30 开发商实际上为此举办了一场派对
1740470400 2025-02-25 08:00:00 10位普通的现代时间戳
2147483647 2038-01-19 03:14:07 32位签名最大值 - 请参阅下面的Y2038

第四行是我最喜欢的例子,原因很微妙:很多教程页面列表 1740470400 作为"2025年2月25日12:00:00。"实际上是它' 世界标准时间 08:00-某人在当地时区转换过一次,从此就一直复制粘贴错误的值。用工具验证时间戳,而不是用博客文章。包括这个。

秒或毫秒 - 您如何判断?

数数字对于当前时代的任何日期:

  • 10位数字 (x),在2019年10月10日,在2019年10月10日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2011740470400) - 秒。Unix 惯例,大多数 API,PHP's time(),Python's time.time() (作为浮标),条纹's API。
  • 13位数字 (x),在2019年10月10日,在2019年10月10日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2011740470400000) - 毫秒。 JavaScript's Date.now(),java's System.currentTimeMillis(),mongodb 日期。

这是产生我的年份 57123 续订日期的确切区别,因此 I'll 阐明了失败模式:

  • ms 解释为秒 → 日期约为 55,000 年 未来
  • 秒解释为 ms → 日期 1970年一月 (一切崩溃到约3周的时间内)

如果您在阅读一行代码之前看到签名(古代日期或荒谬的遥远未来日期),您就会知道该错误。 时间戳转换器 检测数字计数并标记这两种解释,这解决了 "这是 s 还是 ms?"两秒钟内参数。

您实际上需要了解哪些日期格式?

三几乎涵盖了开发人员所接触到的所有内容。

ISO 8601- 国际标准, 以及您应该在 API 和日志中发出的内容:

2026-07-13T09:30:45Z          UTC ("Z" = Zulu)
2026-07-13T15:30:45+06:00     with timezone offset
2026-07-13T09:30:45.123Z      with milliseconds

没有人提及的杀手级功能:ISO 8601 字符串 按时间顺序按词典顺序排序sort 在日志文件上只会工作。 02/25/2026-风格格式可以't那样做 - 更糟糕的是,美国 MM/DD 和欧洲 DD/MM 每个月的十二天是无法区分的。

RFC 3339 (x),在2019年10月10日,在2019年10月10日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在201规格) - ISO 8601 的互联网协议配置文件。稍微严格;如果您的 API 发出 2026-07-13T09:30:45Z 你满足两者。这是要标准化的格式。

RFC 2822 (x),在2019年10月10日,在2019年10月10日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在2019年10月11日,在201Sun, 13 Jul 2026 09:30:45 +0000) - 电子邮件和 HTTP 标头、RSS 源。您读取它的频率高于编写它的频率。

数据库格式是近亲:MySQL DATETIME2026-07-13 09:30:45 (带空格的 ISO)、PostgreSQL timestamptz 渲染 2026-07-13 09:30:45+00

我使用的语言如何处理时间戳?

我自己的堆栈中的三个--以及每个堆栈中的怪癖,这让我个人付出了时间。

JavaScript (第一女士):

Math.floor(Date.now() / 1000)        // current Unix seconds — Date.now() is ms!
new Date(1740470400 * 1000)          // seconds → Date: multiply by 1000
date.toISOString()                   // "2025-02-25T08:00:00.000Z"
Date.parse('2026-07-13T09:30:45Z') / 1000   // ISO string → Unix seconds

怪癖:一切都是毫秒,而且 new Date(1740470400) 1970年1月21日 默默地给你而不是2025年2月 无错误 这种不对称是web开发中最常见的一个时间戳错误。

PHP (秒一):

time();                                   // current Unix seconds
date('Y-m-d H:i:s', 1740470400);          // "2025-02-25 08:00:00" (server TZ!)
strtotime('2026-07-13 09:30:45');         // string → timestamp
(new DateTime('@1740470400'))
    ->setTimezone(new DateTimeZone('Asia/Dhaka'))
    ->format(DateTime::ATOM);             // "2025-02-25T14:00:00+06:00"

怪癖: date() 格式在 服务器's default timezone,所以相同的代码会在你的机器上和生产中打印不同的日期。还有, new DateTime('@1740470400') 忽略您传递给构造函数的任何时区 - @ 表格始终为 UTC;您必须致电 setTimezone() after。wordpress 添加了自己的图层: current_time('timestamp') 返回一个假"本地"时间戳偏离真实的 Unix 时间,这与听起来一样危险。

Python:

import time, datetime
int(time.time())                                      # current Unix seconds
datetime.datetime.fromtimestamp(1740470400,
    tz=datetime.timezone.utc)                         # → aware datetime
dt.isoformat()                                        # "2025-02-25T08:00:00+00:00"

怪癖: fromtimestamp() 没有 tz= 在本地时间返回一个朴素的日期时间,朴素的日期时间是 Python 时间错误:它们会快乐地相互比较和减法,直到其中一个跨越 DST 边界的那一天。总是过去 tz=;使用 zoneinfo (stdlib 自 3.9 起)用于命名区域。

您应该如何在不失去理智的情况下处理时区?

4条规则, 都学会了讨厌的方式:

  1. 存储 UTC。总是。 Unix 时间戳或 timestamptz 在数据库中。时区只会成为一个显示问题。
  2. 在表示层进行转换。 达卡的用户看到 +06:00,柏林的用户看到 +02:00中,数据库看不到两者。
  3. 使用 IANA 名称,而不是缩写。 Asia/DhakaAmerica/New_YorkEurope/Berlin.缩写含煳不清- CST 意美国中部,中国标准时间,或古巴标准时间取决于谁's阅读-和缩写don't编码DST规则。IANA名称做。
  4. 切勿手动滚动 DST 逻辑。 DST日期因国家而异,因立法而异,有些地方(亚利桑那州,孟加拉国,日本)don't根本观察DST。IANA tz数据库的存在,因为这确实很难;使用包裹它的库。

1条规则的推论:当两个系统对事件时间存在分歧时,将两个值转换为UTC Unix时间戳,并比较整数。关于"的争论,但它在这里说3 PM"立即溶解。

Y2038问题是什么,你应该关心吗?

32 位有符号整数最大值为 2,147,483,647。作为Unix时间戳,那's 世界标准时间 2038 年 1 月 19 日 03:14:07.一秒钟后,数值将负值包裹起来- 到1901年12月13日。

听起来很远;它是't,有两个原因。首先,它's大约11.5年后,我写了这个--很好地融入了嵌入式系统、工业控制器的寿命,以及一项没有人愿意触摸的遗留服务。其次, 未来 日期提前触及:计算 15 年抵押贷款时间表或 20 年证书到期的系统将跨越 2038 年 今天。MySQL's TIMESTAMP 列类型是经典的陷阱 - it's 32位有界和can't商店日期超过2038-01-19,而 DATETIME 在同一个数据库中很好。

You'64位上安全无虞 time_t (任何现代操作系统)、 JavaScript(float64 毫秒)、 Python(任意精度)和 PostgreSQL。you're 在 32 位嵌入式系统上面临风险,旧的 TIMESTAMP 列,以及硬编码的 C 代码 int32_t 为时间。测试很简单:推送 2147483648 (超过限制)通过您的管道,看看会发生什么。 时间戳转换器 2038年后的测试值会很乐意为您生成。

时间戳在真实调试中显示在哪里?

JWT到期。 代币携带 iatexp 声明为 Unix 秒:

{ "sub": "user_8241", "iat": 1783915890, "exp": 1783919490 }

"为什么这个用户注销了?"通过转换来回答 exp。解码中的令牌 jwt解码器 并转换声明 - 均运行客户端,这很重要,因为粘贴的令牌是实时凭据(the) 数据隐私指南 盖(为什么我拒绝在服务器端工具中放入令牌)。

对数相关性。 一次事件、三项服务、三种格式:nginx 日志 [13/Jul/2026:09:30:45 +0000]、应用程序记录ISO 8601,队列工作人员记录原始历元秒。将所有内容转换为一种格式是构建时间线的零步。

API 集成。 条纹发送 "created": 1740470400 (秒)。一个 JavaScript 构建的 API 发送 1740470400000 (ms)。google API 发送 RFC 3339 字符串,如果您将这三个字符串全部消耗掉,则转换是't 偶尔 - it's 常量。格式化中的有效负载 json格式化程序 并转换有趣的字段。

日期范围查询。 WHERE created_at >= 1752364800 AND created_at < 1752451200-那是正确的一天吗?转换界限和检查, UTC X 1000 2019年1月1日,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间内,在世界标准时间、运行删除之前。相关: 日期差计算器 为&quot;这两者之间相隔几天?&quot;,的 时区转换器 用于会议时间数学,以及 克朗解析器 为&quot;这个时间表什么时候真的开火了?&quot;。

常见问题

什么是 Unix 时间戳?

1970年1月1日以来,00:00:00 UTC(Unix时代)所经过的秒数,存储为单个整数。It&#39;s时区- 根据定义独立- 相同的瞬间是地球上任何地方的相同数字- 这就是为什么它&#39;s是跨操作系统、语言和数据库的标准交换格式。

为什么有些时间戳有 10 位数字,而另一些时间戳有 13 位数字?

10位数是秒(标准Unix约定,PHP,大多数API);13位数是毫秒(JavaScript&#39;s Date.now(),Java)。除以1000从ms到秒。混淆两个班次的日期要么是 ~ 55000年后的未来,要么是回到1970年1月。

Unix时间戳可以表示1970年之前的日期吗?

是的 - 负值从时代开始倒计时。 -86400 是1969年12月31日,一个32位有符号时间戳可以追溯到1901年12月13日,一些系统和API拒绝负时间戳,不过,所以在依赖它们之前进行测试。

Y2038是什么问题?

2,147,483,647处的32位有符号时间戳溢出 - 2038年1月19日,世界标准时间03:14:07 - 包装到1901年12月 现代64位系统不受影响,但32位嵌入式设备,遗留C代码和MySQL TIMESTAMP 列曝光,计算远期日期(抵押贷款、证书)的系统在2038年到来之前几年就遇到了错误。

为什么我的约会显示 1970 年 1 月?

0或接近零的时间戳到达你的格式代码-通常是未初始化的值,失败的解析返回0,或者在预期毫秒的地方经过秒屏幕上的1970年日期几乎从来都不是数据点;it&#39;s穿着服装的空。

我应该在数据库中存储时间戳或日期时间字符串吗?

UTC 存储方式任一方式 - 类型比时区纪律重要 Unix 整数紧凑,排序琐碎,完全闪避解析; timestamptz/DATETIME SQL中列是人类可读的查询结果和支持日期算术,你不能做的是存储本地时间而没有偏移 - that&#39;s数据丢失你只在下一个DST过渡时发现。

纪元是否受到闰秒的影响?

实际上,不。 Unix 时间假装闰秒 don&#39;t 存在 - 每天恰好是 86,400 秒,系统通常会在闰秒发生时涂抹或踩下时钟。对于应用程序代码来说,这是非问题;它只在科学计时环境中很重要,其中使用 TAI 或 GPS 时间。

将生产日志时间戳粘贴到在线转换器中安全吗?

仅原始时间戳很少显示,但时间戳通常会与上下文一起传播 - 用户 ID、令牌声明、日志行。 时间戳转换器 on toolz。dev 完全在浏览器中转换,不会传输数据,因此直接从生产日志或 JWT 中粘贴值不会&#39;t 暴露任何东西。

如何将 Unix 时间戳转换为可读日期?

UTC 和本地结果中粘贴数字到转换器中, 或者在代码中进行: new Date(ts * 1000).toISOString() 在 JavaScript 中, datetime.fromtimestamp(ts, tz=timezone.utc) 在python中, date -u -d @ts linux上。首先要正确的一件事是你的值是秒还是毫秒- 其他一切都从中得出。

如何获取当前的 Unix 时间戳?

date +%s 在外壳中, Math.floor(Date.now() / 1000) 在 JavaScript 中, int(time.time()) 在python中, SELECT EXTRACT(EPOCH FROM NOW()) 在 PostgreSQL 中。请注意,JavaScript 是奇怪的: Date.now() 返回毫秒,因此除法不是可选的。

Frequently Asked Questions

The number of seconds elapsed since January 1, 1970, 00:00:00 UTC (the Unix epoch), stored as a single integer. It's timezone-independent by definition — the same instant is the same number everywhere on Earth — which is why it's the standard interchange format across operating systems, languages, and databases.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!