写一个表示一周日期与星期的程序。设定周从星期日开始。
日期和星期的表现形式自由选择。例如现在是2009年7月23日,可以像下面这样表示。
07/19 (Sun)
07/20 (Mon)
07/21 (Tue)
07/22 (Wed)
07/23 (Thu)
07/24 (Fri)
07/25 (Sat)
写程序的时候可以使用Ruby的标准库。
--
黒田努
解答与说明的显示・隐藏
解答与说明
解这道题的要点是搞清楚题中所说的“Ruby的标准库”是什么。
RUBY初学者小林的解答如下。
def OutputDate( time )
print time.strftime("%m") + "/" + time.strftime("%d") +" (" +time.strftime("%a") + ")\n"
end
day_time = 60*60*24
t = Time.new
t = t - ( day_time*t.wday )
for i in 0..6
add_time = day_time
OutputDate( t + ( add_time*i ) )
end
他使用了内置类的Time。
在全局变量t设定当前时刻,取出t.wday日期的秒数,在t上重新设置。wday是将星期日表示为0,星期一表示为1…这样的表示“星期”的整数,所以变量t指向这个星期的星期日的某个时刻。然后,将0到6的整数在i上按顺序设置的同时,在方法Output上显示i从变量t开始经过的时刻。
虽说功能上没什么问题,但是还是存在几个需要修改的地方。
一是strftime方法的使用方法。在指定参数的字符串中可以包含斜线号(/)等记号,所以可以像下面这样写的简洁一点。
def OutputDate( time )
print time.strftime("%m/%d (%a)\n")
end
这样一来变量add_time就暂时变得多余。
for i in 0..6
OutputDate( t + ( day_time*i ) )
end
最让我留意的是,全局变量t的作用在半路发生了变化,还有指向一天的某个时刻。如果仔细的看代码的话便知道计算是正确的,但是粗略一看的话并不容易理解。
处理日期的话应该使用到Date类的吧。
下面的代码是MTG的解答。
this_day = Date.today
this_sunday = this_day - this_day.wday
0.upto(6) do |i|
day = this_sunday + i
puts day.strftime("%m/%d (%a)")
end
实际上这个和我原先准备刊登出来准备做示范解答的差不多。
但是,有一点错误!
Date类属于标准类,因为不是内置类,所以需要、require。大概添加进邮件的时候出现手误了吧。
因此,示范解答如下。
require 'date'
this_sunday = Date.today - Date.today.wday
0.upto(6) do |i|
day = this_sunday + i
puts day.strftime("%m/%d (%a)")
end
《解答与说明》刊登之后,收到了MTG的邮件,告诉我在他的环境中没有require 'date'也不会出现错误。虽然还没弄清在怎样的条件下错误不会出现,但是还是改成了“通常情况下需要require”。知道的读者请务必赐教。
还有MTG还问了 Date.today 与 Date.today.wday 之间日期是否有变化的可能。一句话,就是 this_sunday是否有可能变成星期六。通过执行Time.now.usec - Time.now.usec代码试了一下,确实-1或-2的值返回了。MTG的代码正确的。在此改正。
上面的订正刊登之后,river125发来邮件,告诉我在环境变量 RUBYOPT 设置-rrubygems 或 -rauto_gem 的值的话、,require 'date' 就不需要了。用One-click Ruby Installer在 Windows 上安装 Ruby,与使用Gentoo Linux 等情况下满足的。谢谢赐教。