1. 基本概念
Time
:Ruby 内置类,处理日期和时间,精确到秒。Date
:标准库类,专注于日期操作。DateTime
:结合日期和时间,支持更复杂的需求。
引入标准库
Date
和 DateTime
需要加载标准库:
require 'date'
2. Time
类
创建时间
# 当前时间
now = Time.now
puts now # 2025-03-22 10:15:30 +0800(示例)
# 指定时间
specific = Time.new(2025, 12, 25, 14, 30, 0)
puts specific # 2025-12-25 14:30:00 +0800
访问时间组件
now = Time.now
puts now.year # 2025
puts now.month # 3
puts now.day # 22
puts now.hour # 10
puts now.min # 15
puts now.sec # 30
格式化时间
用 strftime
方法:
now = Time.now
puts now.strftime("%Y年%m月%d日 %H:%M:%S") # 2025年03月22日 10:15:30
puts now.strftime("%A, %B %d") # Saturday, March 22
常见格式化符号:
%Y
:四位年份%m
:月份(01-12)%d
:日(01-31)%H
:小时(00-23)%M
:分钟(00-59)%S
:秒(00-59)%A
:星期名称%B
:月份名称
3. 时间计算
加减时间
now = Time.now
future = now + 3600 # 加 1 小时(3600 秒)
past = now - 86400 # 减 1 天(86400 秒)
puts future.strftime("%H:%M") # 11:15(假设现在是 10:15)
puts past.strftime("%Y-%m-%d") # 2025-03-21
时间差
start = Time.new(2025, 3, 22, 10, 0)
end_time = Time.new(2025, 3, 22, 12, 0)
diff = end_time - start
puts "时间差:#{diff / 3600} 小时" # 时间差:2 小时
4. Date
类
创建日期
require 'date'
# 当前日期
today = Date.today
puts today # 2025-03-22
# 指定日期
birthday = Date.new(2000, 5, 15)
puts birthday # 2000-05-15
解析日期字符串
date = Date.parse("2025-03-22")
puts date # 2025-03-22
访问日期组件
puts today.year # 2025
puts today.month # 3
puts today.day # 22
puts today.wday # 6(星期六,0=星期日)
日期计算
tomorrow = today + 1
puts tomorrow # 2025-03-23
last_week = today - 7
puts last_week # 2025-03-15
5. DateTime
类
创建日期时间
require 'date'
now = DateTime.now
puts now # 2025-03-22T10:15:30+08:00
specific = DateTime.new(2025, 12, 25, 14, 30, 0)
puts specific # 2025-12-25T14:30:00+00:00
格式化
puts now.strftime("%Y年%m月%d日 %H:%M") # 2025年03月22日 10:15
时区支持
require 'date'
dt = DateTime.parse("2025-03-22 10:00:00 +0800")
puts dt.zone # +08:00
6. 中文支持示例
时间格式化
now = Time.now
puts "今天是 #{now.strftime("%Y年%m月%d日")}" # 今天是 2025年03月22日
日期计算
require 'date'
birthday = Date.new(2000, 5, 15)
age = (Date.today - birthday) / 365
puts "年龄:#{age.to_i} 岁" # 年龄:24 岁(假设今天是 2025-03-22)
7. 实践案例
案例 1:倒计时
require 'date'
target = DateTime.new(2025, 12, 31, 23, 59, 59)
now = DateTime.now
days_left = (target - now).to_i
puts "距离 2025 年末还有 #{days_left} 天" # 距离 2025 年末还有 284 天(示例)
案例 2:任务提醒
class Task
def initialize(name, due_date)
@name = name
@due_date = Date.parse(due_date)
end
def check
days = (@due_date - Date.today).to_i
if days < 0
"任务 #{@name} 已过期 #{days.abs} 天"
elsif days == 0
"任务 #{@name} 今天到期"
else
"任务 #{@name} 还有 #{days} 天"
end
end
end
task = Task.new("提交报告", "2025-03-25")
puts task.check # 任务 提交报告 还有 3 天
案例 3:工作日检查
require 'date'
date = Date.today
if date.saturday? || date.sunday?
puts "今天是周末:#{date.strftime("%Y年%m月%d日")}"
else
puts "今天是工作日:#{date.strftime("%Y年%m月%d日")}"
end
输出(假设今天是周六):
今天是周末:2025年03月22日
8. 注意事项
- 时区:
Time
默认使用系统时区,DateTime
支持显式时区。 - 精度:
Time
精确到秒,Date
只处理日期。 - 性能:频繁计算时,
Time
比DateTime
更快。 - 中文格式:确保终端支持 UTF-8 输出中文。
9. 高级用法
时区处理(需 tzinfo
gem)
require 'tzinfo'
tz = TZInfo::Timezone.get('Asia/Shanghai')
time = tz.local_to_utc(Time.now)
puts time # UTC 时间
日期范围
require 'date'
start = Date.new(2025, 3, 1)
range = start..start + 6
range.each { |d| puts d }
输出:
2025-03-01
2025-03-02
...
2025-03-07
下一步
- 练习:告诉我你想用日期时间做什么(计算年龄、格式化等),我可以设计一个例子。
- 问题解答:对日期时间用法有疑问吗?直接问我!
- 深入学习:想了解时区处理或与数据库的集成吗?我可以继续讲解。
你现在想做什么?写代码、问问题,还是其他?
发表回复