【问题标题】:Finding the date for a given week number查找给定周数的日期
【发布时间】:2012-03-23 09:55:30
【问题描述】:

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

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

现在我知道本周是什么,我想弄清楚下一周和前一周是什么。我需要获取年份(2012)和周数(10)并将其转换回日期对象,以便计算下一周/上一周的值。我该怎么做?

【问题讨论】:

  • 这是在 Rails 中/你可以使用 ActiveSupport 吗?它为这样的事情提供了一些不错的约会助手。另外,“下周和上周”是指在 date 之后和之前的 7 天还是这几周的开始?
  • 这是一个 Sinatra 应用程序,但如果 ActiveSupport 提供了能够做到这一点的功能,并且我可以将它与 Sinatra 应用程序一起使用,我愿意使用它。

标签: ruby date


【解决方案1】:

使用Date 对象进行每日计算非常简单。如果您只想从给定的Date 对象中获取上一周/下一周,请使用以下命令:

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

【讨论】:

  • 这看起来很有希望。现在,我将如何从给定的周和年(即不是本周)初始化一个新的日期对象?
  • @steenslag 这只是您经常习惯的东西(尤其是如果您的大部分 Ruby(日期)工作恰好与 Rails 相关)。与习惯于在 Ruby 中使用 inject 然后转到 Java 并且您必须自己编写它并没有太大区别——它只是另一个通用库。我完全赞成在依赖之前使用 Ruby 核心,但如果你已经有了 ActiveSupport,为什么不使用它呢?
【解决方案2】:

在 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

【讨论】:

  • 这看起来很有希望。现在,我将如何从给定的周和年(即不是本周)初始化一个新的日期对象?
【解决方案3】:

你想要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

【讨论】:

  • @Ansar 你当时做了什么?
  • @PratikBothra 看看我的答案以获得正确的周数
【解决方案4】:

假设您的意思是“当前年份的给定周数”,您可以执行以下操作:

2.weeks.since(Time.gm(Time.now.year))
=> Fri Jan 15 00:00:00 UTC 2010

将上面的 1 替换为 (week_number - 1),您将获得所需周的日期。

【讨论】:

    【解决方案5】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 2014-07-15
      • 2022-08-03
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多