时区
处理时区
时区 是 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 反馈 — 无需本地设置。