【问题标题】:Set a datetime for next or previous sunday at specific time在特定时间设置下一个或上一个星期日的日期时间
【发布时间】:2012-04-04 16:39:31
【问题描述】:

我有一个应用程序,其中始终存在当前比赛(由 start_date 和 end_date 日期时间定义)。我在 application_controller.rb 中有以下代码作为 before_filter。

def load_contest
 @contest_last = Contest.last
 @contest_last.present? ? @contest_leftover = (@contest_last.end_date.utc - Time.now.utc).to_i : @contest_leftover = 0

 if @contest_last.nil?
  Contest.create(:start_date => Time.now.utc, :end_date => Time.now.utc + 10.minutes)
 elsif @contest_leftover < 0
  @winner = Organization.order('votes_count DESC').first
  @contest_last.update_attributes!(:organization_id => @winner.id, :winner_votes => @winner.votes_count) if @winner.present?
  Organization.update_all(:votes_count => 0)
  Contest.create(:start_date => @contest_last.end_date.utc, :end_date => Time.now.utc + 10.minutes)
 end
end

我的问题:

1) 我想将 :end_date 更改为表示下周日的某个时间(例如下周日晚上 8 点)。同样,我可以在某个时间将 :start_date 设置为上一个星期日。我看到有一个 sunday() 类(http://api.rubyonrails.org/classes/Time.html#method-i-sunday),但不知道如何指定当天的某个时间。

2) 对于这种总是想要当前比赛的情况,有没有更好的方法在应用中加载它?如果创建一个新的,缓存它会更好然后重新加载吗?不知道如何做到这一点,但似乎更有效率。

谢谢!

【问题讨论】:

    标签: ruby-on-rails time


    【解决方案1】:

    从这个 sn-p 开始。在rails中,给定一个日期/时间对象d,表达式

    d - wday.day
    

    给出最后一个星期日不是在该日期之后。即,如果这一天本身是星期日,则结果将为 d。

    然后去下个星期天:

    sunday1 = d - wday.day
    sunday2 = sunday1 + 7.day
    

    并为两者设置时间:

    sunday1 = (d - wday.day).change(:hour => 8,:min => 30)
    sunday2 = (sunday1 + 7.day).change(:hour => 20)
    

    不需要任何外部模块。 Rails(但不是核心 ruby​​!)具有您需要的所有日期/时间操作功能。

    注意change函数是如何工作的:如果你只传递:hour,它会将分钟和秒重置为0。如果你传递:hour:minute,它只会重置秒。详情请见the docs

    最后一件事:注意您使用的时区。

    【讨论】:

    • 谢谢。但最终我将如何指定那些日子的时间(例如美国东部时间晚上 8 点)?
    • 而不是 :minute => 30 它应该是 :min => 30
    猜你喜欢
    • 2015-09-11
    • 2021-04-07
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多