打印

每个月 工作日的计算?

每个月 工作日的计算?

指定年和月,计算出这个月里工作的天数,也就是除去这个月里所有的星期六和星期日后所剩下的天数,请问Rails 里有这个方法可以直接用的吗? 还是要自己写呀,朋友们,给点提示吧! 在下先谢谢了!!!

TOP

自已写吧.貌似没有.
本帖最近评分记录
  • drive2me R币 +5 谢谢! 2008-5-26 20:35

TOP

这个倒挺有意思,可以写一个玩玩
本帖最近评分记录
  • drive2me R币 +5 鼓励写一个玩玩!完了,传上来呀。 2008-5-26 20:36
Digging ruby with Pickaxe,
Running agilely on rails

TOP

Ruby处理Excel文件很容易的,而且Excel有现成的算法呀。连表格都可以给出的。
写一个很容易的...
Flying Piggy...! 
天地人合一!

TOP

做出来了 [参考书 :Ruby Cookbook]

  def every_saturday(d1, d2)
    # You can use 1.day instead of 60*60*24 if you're using Rails.
    one_day = d1.is_a?(Time) ? 60*60*24 : 1
    saturday = d1 + ((6-d1.wday) % 7) * one_day
    while saturday < d2
     yield saturday
     saturday += one_day * 7
    end
    end
    def print_every_saturday(d1, d2)
    i = 0
    every_saturday(d1, d2) { |saturday| i = i + 1 }
    return i
    end

  def every_sunday(d1, d2)
    # You can use 1.day instead of 60*60*24 if you're using Rails.
    one_day = d1.is_a?(Time) ? 60*60*24 : 1
    sunday = d1 + ((7-d1.wday) % 7) * one_day
    while sunday < d2
     yield sunday
     sunday += one_day * 7
    end
    end
    def print_every_sunday(d1, d2)
    i = 0
    every_sunday(d1, d2) { |sunday| i = i + 1 }
    return i
    end
def print_working_days(year, month)
  days_in_month = (Date.new(year,12,31).to_date << (12-month)).day
  if month < 12
  saturday_in_month = print_every_saturday(Time.local(year, month, 1), Time.local(year, month+1, 1))
  sunday_in_month = print_every_sunday(Time.local(year, month, 1), Time.local(year, month+1, 1))
  else
  saturday_in_month = print_every_saturday(Time.local(year, month, 1), Time.local(year+1, 1, 1))
  sunday_in_month = print_every_sunday(Time.local(year, month, 1), Time.local(year+1, 1, 1))
  end
  working_days = days_in_month - saturday_in_month - sunday_in_month
  return working_days
 end

[ 本帖最后由 bluesnake 于 2008-5-28 18:15 编辑 ]
本帖最近评分记录
  • drive2me R币 +10 Great Job. 2008-5-30 11:36
  • 5swords R币 +5 不错, 这么长啊. 2008-5-28 17:57

TOP

我也写出来了,考试之后用卷子背面写的....

require 'date'
#working_day(5)  
#=>22
#working_day(5,2007)
#=>23
def working_day(month,year = Date.today.year)
  last_day = [0,31,28,31,30,31,30,31,31,30,31,30,31]
  first_day = Date.new(year,month,1)
  last_day[2] = 29 if first_day.leap?  #处理闰年
  if first_day.cwday == 7  #第一个星期日在第一个星期六之前
    first_satday = 1
    first_sunday = 7
  else                     #第一个星期日在第一个星期六之后
    first_satday = 7 - first_day.cwday #6 - first_day.cwday + 1
    first_sunday = first_satday + 1
  end
  satdays = (last_day[month] - first_satday) / 7 + 1
  sundays = (last_day[month] - first_sunday) / 7 + 1
  return last_day[month] - satdays - sundays
end


单元测试:

class TestWorkingDay < Test::Unit::TestCase

  def test_no_error
    assert_nothing_raised {working_day(Date.today.month)}
  end

  def test_correct
    y = Date.today.year
    last_day = [0,31,28,31,30,31,30,31,31,30,31,30,31]
    last_day[2] = 29 if Date.today.leap?
    1.upto(12) do |m|
      s = 0
      1.upto(last_day[m]) do |d|
        t = Date.new(y,m,d)
         s += 1 if (t.cwday == 6 || t.cwday == 7)
      end
      assert_equal(working_day(m),last_day[m] - s)
    end
  end

end


[ 本帖最后由 xavier 于 2008-5-30 17:49 编辑 ]
本帖最近评分记录
  • bluesnake R币 +5 精品文章 2008-6-2 11:22
  • drive2me 贡献 +10 青出于蓝! 2008-5-30 11:39
  • drive2me R币 +10 青出于蓝! 2008-5-30 11:39
  • drive2me 威望 +10 青出于蓝! 2008-5-30 11:39
  • 5swords R币 +10 厉害, 还有CASE啊! 2008-5-29 20:17
Digging ruby with Pickaxe,
Running agilely on rails

TOP

回复 6# 的帖子

方法的头上要是加一些接口和用法的注释就最好了.
本帖最近评分记录
  • xavier R币 +3 谢谢建议~ 2008-5-31 07:38

TOP

小X,

你是小ROR迷了呀,考完试还在写程序,哈哈。
年轻有为!

那你考大学就学软件工程专业吧。呵呵。
Flying Piggy...! 
天地人合一!

TOP

这个主题,我收藏了。
谢谢!
Flying Piggy...! 
天地人合一!

TOP

谢谢 xavier !!
学习

TOP

2008-08-29 11:00 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.60