0Pricing
Ruby Academy · 课时

时区

处理时区

时区 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。

时区为何重要

同一时刻在不同地点看起来可能不同。错误处理时区会导致相差数小时的错误,因此您必须明确时间使用的是哪个时区。

t = Time.new(2026, 5, 30, 12, 0, 0, '+03:00')
puts(t.zone || t.utc_offset)
puts(t.utc_offset)

UTC:参考时区

UTC(协调世界时)是全球参考时间。请使用 UTC 存储数据并进行计算,然后在显示时再进行转换。

t = Time.utc(2026, 5, 30, 9, 0, 0)
puts(t.utc?)
puts(t.hour)

本地时间

Time.now 和 Time.local 使用计算机的本地时区。UTC 的偏移量由 utc_offset 以秒为单位给出。

t = Time.new(2026, 5, 30, 12, 0, 0, '+03:00')
puts(t.utc_offset)
puts(t.utc_offset / 3600)

转换为 UTC

getutc(别名为 utc)会返回以 UTC 表示的同一时刻。时钟显示会改变,但时刻本身完全相同。

t = Time.new(2026, 5, 30, 12, 0, 0, '+03:00')
puts(t.hour)
puts(t.getutc.hour)

转换为本地偏移量

getlocal 接受明确的偏移量字符串,并返回处于该时区的时刻。

t = Time.utc(2026, 5, 30, 9, 0, 0)
istanbul = t.getlocal('+03:00')
puts(istanbul.hour)

创建时指定偏移量

将偏移量字符串作为最后一个参数传递给 Time.new,即可在创建时固定时区。

ny = Time.new(2026, 5, 30, 8, 0, 0, '-04:00')
puts(ny.utc_offset / 3600)
puts(ny.getutc.hour)

同一时刻,不同的时钟

处于不同时区的两个时间可以表示完全相同的时刻。比较时使用底层时刻,因此它们相等。

a = Time.new(2026, 5, 30, 12, 0, 0, '+03:00')
b = Time.new(2026, 5, 30, 9, 0, 0, '+00:00')
puts(a == b)

ISO 8601 中的偏移量

ISO 8601 时间戳会嵌入偏移量(例如 +03:00,或表示 UTC 的 Z),因此在不同系统之间不会产生歧义。

require 'time'
t = Time.new(2026, 5, 30, 12, 0, 0, '+03:00')
puts(t.iso8601)
puts(t.getutc.iso8601)

解析包含时区的字符串

Time.parse 会遵循输入字符串中存在的偏移量。

require 'time'
t = Time.parse('2026-05-30T12:00:00+03:00')
puts(t.utc_offset / 3600)
puts(t.getutc.hour)

最佳实践:存储 UTC

最安全的模式是:存储 UTC,在 UTC 中进行算术运算,并且只在显示时转换为用户所在的时区。这样可以完全避免歧义。

stored = Time.utc(2026, 5, 30, 9, 0, 0)
display = stored.getlocal('+03:00')
puts("UTC #{stored.hour} -> Local #{display.hour}")

DST 注意事项

像 +03:00 这样的固定偏移量不会考虑夏令时。对于包含 DST 规则的命名时区,需要使用 tzinfo gem 等库;核心 Time 类只了解固定偏移量。

t = Time.new(2026, 7, 1, 12, 0, 0, '+02:00')
puts(t.utc_offset / 3600)

快速检查

在应用程序中处理时区时,推荐采用什么策略?

回顾:时区

您已经学会了正确处理时区:

  • UTC 是全球参考时间
  • getutc 和 getlocal 在不改变时刻的情况下进行转换
  • 可以在创建时或 ISO 8601 字符串中设置偏移量
  • 不同时区中的同一时刻比较结果相等
  • 存储 UTC,显示本地时间;固定偏移量不会考虑 DST
require 'time'
puts(Time.utc(2026,5,30,9).getlocal('+03:00').hour)

常见问题解答

「时区」课时是免费的吗?

是的 — 「时区」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「时区」这节课中我会学到什么?

处理时区 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「时区」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 时间与日期类
  2. 解析与格式化
  3. 时间运算
  4. 时区
← 返回 Ruby Academy