You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中负Unix时间戳与Discord时间戳显示不一致问题及可靠表示阈值咨询

Ruby中负Unix时间戳与Discord时间戳显示不一致问题及可靠表示阈值咨询

你遇到的这个问题其实挺典型的,本质是不同系统对负Unix时间戳的底层实现、日历转换规则以及数值范围支持不一样导致的,咱们一步步拆解来看:

先把你给出的测试场景再明确下:

  • Ruby端的测试代码及结果:
    time = Time.at(-8_640_000_000_000) # => -271821-04-19 19:00:00 -0500
    time.strftime('%B %-d, %Y at %-I:%M %p') # => "April 19, -271821 at 7:00 PM"
    
  • Discord端的测试代码及结果:
    <t:-8640000000000> # => November 19, 271817 at 7:03 PM
    

为什么会出现这么大的差异?

核心原因有两个:

  1. 数值溢出与类型限制
    Unix时间戳本质是从1970年1月1日UTC开始计算的秒数(部分系统支持毫秒级),但很多软件在处理时间戳时,底层会依赖特定的整数类型。比如32位有符号整数的范围是-2147483648到2147483647,对应时间范围是1901年12月13日到2038年1月19日。你用的这个时间戳-8_640_000_000_000远小于32位有符号整数的最小值,要是Discord的某个处理环节用了32位整数,这个超大负数就会被错误转换成一个大正数,这就能解释为什么Discord显示的是公元后271817年,而非Ruby里的公元前271821年。
  2. 日历转换逻辑差异
    Ruby的Time类在处理极早的日期时,会遵循更严谨的日历规则(比如区分儒略历和格里高利历的切换节点),而Discord的时间戳渲染可能用了简化的日历模型,甚至在处理公元前日期时存在逻辑bug,直接把负年份当成正年份来处理,这也会导致日期完全偏离预期。

那什么时候负Unix时间戳会“太老”而无法可靠表示?

这个没有统一的标准答案,完全看具体软件的实现,但可以给你几个通用的参考阈值:

  • 基于32位整数的系统/软件:负时间戳不能早于1901年12月13日(对应Unix时间戳-2147483648),超过这个点就会触发整数溢出,时间显示彻底错误。
  • 基于64位整数的系统/软件:理论上64位有符号整数能表示的最早时间是公元前292277026596年,但实际中很多软件会因为日历系统的限制(比如无法处理过于久远的公元前日期),在早于公元前1年之后就可能出现不准确的情况,部分软件甚至会限制到公元前4713年(儒略日的起始点)。
  • 针对Discord的特殊建议:从你的测试结果来看,Discord对极早的负时间戳支持很差。如果你要在Discord里可靠使用负时间戳,建议不要早于1901年12月13日,也就是32位有符号整数最小值对应的时间点,这个范围以内的负时间戳,Discord应该能正确渲染。

另外你提到的“精度丢失”其实更准确的说是数值溢出或类型转换错误,因为这个时间戳的数值已经超出了很多系统默认的整数处理范围,导致被错误解析。

备注:内容来源于stack exchange,提问作者Droid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:53:01