查找给定周数的日期

问题描述:

我正在尝试根据给定年份的周数进行一些日期数学计算。例如:查找给定周数的日期

date = Date.today # Monday, March 5, 2012 
puts date.cwyear # 2012 
puts date.cweek # 10 (10th week of 2012) 

现在我知道本周是什么,我想弄清楚什么下周前一周是。我需要将年份(2012年)和周数(10)转换回日期对象,以便计算下一周/前一周的值。我怎样才能做到这一点?

+0

这是Rails中/你能请使用ActiveSupport?它为这样的事情提供了一些不错的日期助手。另外,“下一个星期”和“前一个星期”你是指在“日期”或这些星期开始之前和之后的七天? – 2012-03-05 22:22:52

+0

这是一个Sinatra应用程序,但是如果ActiveSupport提供了可以执行此操作的功能,并且可以将它与Sinatra应用程序一起使用,那么我愿意使用它。 – Andrew 2012-03-05 22:24:51

你想Date.commercial

require 'date' 
now = Date.today           #=> 2012-03-05 
monday_next_week = Date.commercial(now.cwyear,now.cweek+1) #=> 2012-03-12 
next_sunday_or_today = monday_next_week - 1    #=> 2012-03-11 

需要注意的是周的星期一开始,所以如果你是在一个星期天,并要求在下周一 - 1个哟你会得到同一天。

还要注意的是,如果你不希望星期一你也可以指定方法的日数:

thursday_next_week = Date.commercial(now.cwyear,now.cweek+1,4) #=> 2012-03-15 
+0

真棒!谢谢! – Andrew 2012-03-05 22:56:33

+0

@Andrew [不客气](http://meta.stackexchange.com/a/5235/153741):) – Phrogz 2012-03-05 23:16:53

+3

这是不工作的 – Thorin 2015-01-29 08:35:07

对于Date对象,每天计算非常简单。如果你只是想从一个给定的Date对象获得一个/下一个星期使用以下命令:

date = Date.today 
previous_week = (date - 7).cweek 
next_week = (date + 7).cweek 
+1

+1永远不要理解那些ActiveSupport cheapo的。 – steenslag 2012-03-05 22:44:55

+0

看起来很有希望。现在,我将如何从给定的周和年(即不是本周)初始化新的日期对象? – Andrew 2012-03-05 22:49:35

+0

@steenslag这只是你经常习惯的东西(特别是如果你的Ruby(Date)的大部分工作恰好在Rails中)。与习惯于在Ruby中注入'然后转到Java并且您必须自己编写它 - 这不过是另一个通用库。我都是在依赖之前使用Ruby核心,但如果你已经拥有ActiveSupport,为什么不使用它呢? – 2012-03-05 23:16:47

在的ActiveSupport你有帮手Fixnum转换为时间http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Numeric/Time.html使用:

date = Date.today 
week_ago = date - 1.week 
next_week = date + 1.week 
+0

看起来很有希望。现在,我将如何从给定的周和年(即不是本周)初始化新的日期对象? – Andrew 2012-03-05 22:50:00

假设你的意思是“在今年给定的周数”,你可以做以下:

2.weeks.since(Time.gm(Time.now.year)) =>周五年01月15 00:00:00 UTC 2010 替代(WEEK_NUMBER - 1),用于在上述的1,你会在所需的一周内得到一个日期。

我已经创造了一些方法来获取给定日期 这样的周数:

def self.get_week(date) 
    year = date.year 
    first_monday_of_the_year = self.get_first_monday_of_the_year(year) 
    # The first days of January may belong to the previous year! 
    if date < first_monday_of_the_year 
     year -= 1 
     first_monday_of_the_year = self.get_first_monday_of_the_year(year) 
    end 
    day_difference = date - first_monday_of_the_year 
    week = (day_difference/7).to_i + 1 
    week 
    end 

    def self.get_monday_of_year_week(year, week) 
    d = self.get_first_monday_of_the_year(year) 
    d + ((week - 1) * 7).days 
    end 

    def self.get_first_monday_of_the_year(year) 
    d = Date.new(year, 1, 7) # 7 Jan is always in the first week 
    self.get_monday_of_week(d) 
    end 

    def self.get_monday_of_week(date) 
    wday = (date.wday + 6) % 7 
    date - wday.days 
    end