【问题标题】:Ruby find next Thursday (or any day of the week) [duplicate]Ruby在下周四(或一周中的任何一天)找到[重复]
【发布时间】:2011-10-01 16:00:00
【问题描述】:

用 Ruby 计算从今天开始的下一个星期四(或任何一天)的日期、月份和年份的最佳方法是什么?

更新 为了创建虚拟对象,我试图弄清楚如何计算随机时间。总之,我想在每周的下一个星期四下午 5 点到 10 点之间生成一个随机时间。

【问题讨论】:

  • 你知道,这个问题比它被标记为重复的问题更早。
  • 如果您在 Google 上找到此问题并且您正在使用 Rails > 5,请使用 Date.today.next_occurring(:friday)

标签: ruby-on-rails ruby ruby-on-rails-3 datetime


【解决方案1】:

除了像其他人描述的那样获取下周四之外,Ruby 还提供了简单的方法来获取任何日期的月份和年份:

month = date.month
year = date.year

在 Rails 内部,您可以在下周四轻松获得:

next_thur = Date.today.next_week.advance(:days=>3)

【讨论】:

  • 太棒了! next_week 总是把日期定在下周星期一。所以我们可以巧妙地使用它。
  • 太棒了!!!非常有用。
  • 您还可以使用以下方式获取下周四(同一周或下一个):week_start = Date.current.wday > 4 ? Date.current.next_week : Date.current.beginning_of_week week_start.advance(days: 3)
  • @WattsInABox 问题似乎对新答案关闭。接受的答案太冗长了IMO。此页面上没有其他答案非常适合我的用例,因此将其添加到此处以供任何未来的访问者使用。
  • 这应该是公认的答案,IMO。
【解决方案2】:
date = Date.today
date += 1 + ((3-date.wday) % 7)
# date is now next Thursday

【讨论】:

  • 卧虎藏龙,这可能是本帖最好的答案了。 :D 谢谢
  • @Trip 嘿,刚才你甚至启发了我让它变得更简单:)
  • 返回相同的日期;)
  • 下周四不会返回,而是返回,date。这是不正确的。
  • 如果 Date.today 已经是星期四,则返回当前日期。我建议date += ((4 - date.wday) % 7) == 0 ? 7 : (4 - date.wday)
【解决方案3】:

IMO chronic 库非常适合此类内容。

Ruby 代码是:

def date_of_next(day)
    Chronic.parse('next #{day}')
end

【讨论】:

  • 这是一个严重的矫枉过正
  • @PiotrekOkoński 是的。但通常,当应用程序需要此功能时,需要更多功能。
  • 自发布此答案 5 年以来,我觉得 chronic 库很好,但现在没有积极维护。如果慢性返回错误的日期,那么我们将被搞砸。这就是为什么我害怕使用它,因为在我的应用程序中,日期计算非常关键。当然,这个日期计算/解析领域有很多需求。
  • 如果有办法修改它的源代码就好了。
  • 感谢推荐,很棒的图书馆
【解决方案4】:

这个 SO 答案也很简短 https://stackoverflow.com/a/7930553/3766839

def date_of_next(day)
  date  = Date.parse(day)
  delta = date > Date.today ? 0 : 7
  date + delta
end

date_of_next "Thursday"

【讨论】:

    【解决方案5】:

    DateTime.now.next_week.next_day(3)

    正如@Nils Riedemann 指出的那样:

    请记住,它不会得到下一个星期四,而是星期四 下周的。例如。如果明天是星期四,它将不会返回 明天,但下周的星期四。

    这是我最近编写的一些处理缺失案例的代码的摘录。

    require 'date'
    
    module DateTimeMixin
    
      def next_week
        self + (7 - self.wday)
      end
    
      def next_wday (n)
        n > self.wday ? self + (n - self.wday) : self.next_week.next_day(n)
      end
    
    end
    
    # Example
    
    ruby-1.9.3-p194 :001 > x = DateTime.now.extend(DateTimeMixin)
     => #<DateTime: 2012-10-19T15:46:57-05:00 ... > 
    
    ruby-1.9.3-p194 :002 > x.next_week
     => #<DateTime: 2012-10-21T15:46:57-05:00 ... > 
    
    ruby-1.9.3-p194 :003 > x.next_wday(4)
     => #<DateTime: 2012-10-25T15:46:57-05:00 ... > 
    

    【讨论】:

    • 酷,我喜欢这个解决方案 - 我已经发布了一个后续问题。
    • 不鼓励像这样移动球门柱。如果您最初想知道某事,请将其放在您的问题中。
    • 没关系,我在这个问题的帮助下想通了:stackoverflow.com/questions/2410639/… 谢谢!
    • 记住它不会得到下一个星期四,而是下周的星期四。例如。如果明天是星期四,则明天不会返回,而是下周的星期四。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多