当前位置:首页>Linux>嵌入式linux开发,为什么 Yocto 编译要强制用 UTC

嵌入式linux开发,为什么 Yocto 编译要强制用 UTC

  • 2026-09-30 07:10:35
嵌入式linux开发,为什么 Yocto 编译要强制用 UTC

点击↑深色口袋物联,选择关注公众号,获取更多内容,不迷路


问题

在构建版本信息时,发现由yocto编译uboot时,生成的时间信息,与实际使用的不一样

而实际上时间应该是上午10点

通过命令timedatectl查看,豁然明白了其中的道理,UTC是通用的,而10点是CST,不同国家值不同

分析

为什么yocto编译要用 UTC?

The TZ environment variable is set to “UTC” within the build environment in order to fix reproducibility problems in some recipes.

https://docs.yoctoproject.org/4.0.33/migration-guides/migration-2.5.html

从Yocto 官方文档,结合实际情况,可以得出如下3点:

  1. 1. 可复现构建(Reproducible Builds)Yocto 的目标是:同一份配置、同一份源码,在任何时间、任何机器上构建出来的二进制文件要完全一样。如果构建过程里嵌入时间信息(例如打包时间、日志时间),且这些时间受时区影响,就会导致同一份源码在不同机器上构建出不同内容。
  2. 2. 统一时间基准在构建环境中强制 TZ=UTC,相当于告诉所有工具:不要按本地时区解释当前时间, 所有时间都以 UTC 输出和存储,这样,无论在北京(UTC+8)还是伦敦(UTC+0),构建产物中嵌入的时间戳都是同一数值。达到跨时区的一致性
  3. 3. 标准化要求:yocto作为嵌入式开源项目,采用UTC 作为无偏移的基准时间,避免时区配置错误导致的日志、任务调度、文件时间等混乱,同时也符合行业默认标准。

所以:看到的“Yocto 编译采用 UTC”,本质上是为了让构建过程可复现、可对比、可溯源、标准化

扩展

那么除了UTC还有那些和时间有关的概念呢?

3.1 UTC

UTC,即(Coordinated Universal Time),世界协调时间,是当前国际通用的时间标准。

  • • 以原子时为基础,通过闰秒修正,
  • • 所有官方时区都以“相对 UTC 的偏移”来定义,例如北京时间 = UTC+8

3.2 GMT

GMT,即(Greenwich Mean Time),格林尼治时间,曾经的世界“时间标准”,

  • • 通过格林尼治天文台的本初子午线定义平太阳时。
  • • 现在 GMT 更多被当作一个时区名(UTC+0),而不是严格的时间标准

很多人把 GMT 当成“标准时间”,实际在现代时间标准体系中,UTC 才是官方标准

3.3 CST

CST ,(China Standard Time),中国标准时间,

  • • “北京时间”,CST = UTC+8

3.4 Unix epoch

Unix epoch(Unix 纪元),即Unix 时间戳,它是指从 1970-01-01 00:00:00 UTC 开始,到某个时刻所经过的秒数

  • • 是Unix/Linux 系统中时间戳的起始点
  • • 数值线性增长,每增加 1 秒,时间戳 +1。
  • • 与时区无关,同一时刻,全球任何地方看到的 Unix 时间戳数值相同。
  • • 2026-03-05 12:30:45 UTC 的秒级时间戳:2138401845

有意思的2038 年问题,早期 32 位 time_t 用有符号 32 位整数存时间戳,最大只能表示到 2038-01-19 左右,之后会溢出“回到” 1901 年,现在主流 64 位系统已经用 64 位 time_t,基本解决该问题。

如下是一个示例,代表了某一刻时间戳,同时转化为不同形式的表现!

https://www.epochconverter.com/https://www.unixtimestamp.com/

3.5 ISO-8601

时间戳都是一串数字,对于人来说非常不好读的,因此需要有一个标准,将时间戳转换成可读的统一时间标准,其中之一就是ISO-8601标准

  • • 核心是 “清晰、无歧义、机器可读”
  • • 它的格式按 “年 - 月 - 日 - T - 时:分: 秒 - 时区” 的固定顺序,如2025-01-28T10:00:00

有时也会看到:带 UTC 时区:2025-01-28T10:00:00Z,或带时区偏移:2025-01-28T18:00:00+08:00

总结

  • • UTC 是全球统一的时间基准,Yocto 用 UTC 是为了跨时区编译的一致性,GMT 是历史基准,已被 UTC 取代;
  • • CST 是本地时区,ISO 8601 是时间表示标准(无歧义),Unix epoch 是时间戳的起始点(1970-01-01 UTC);
  • • 在在跨时区、跨系统的开发中,用 UTC 做底层基准,用 ISO 8601 做格式交互,用时间戳做数值计算,能彻底避免时间相关的歧义问题。

写在最后,linux的世界,小问题的背后,蕴藏着很多,只要愿意追究,就能找到其中的脉络!所以yocto编译出来的UTC时间,记得要加上时区偏移值!


最近在整理嵌入式linux开发的全流程,搭建linux开发知识库,前期主要分3大模块

xboard,侧重板子的bringup,通过配置与调试,使各功能模块正常运行,即一般驱动/bsp工程师的工作内容

xdriver,侧重linux 子系统的深度分析,配合问答与示例,搞清楚其机理,即深挖linux各子系统,遇到关键问题不再抓瞎

xsystem,侧重根文件系统开发和开源工具的使用,方便定位性能问题,即手握神器,犹如庖丁解牛

对此感兴趣的朋友,可以点击关注,分享,让我们共同学习、一起进步!


最新文章

随机文章