【问题标题】:Changing the first day of week in rails在 Rails 中更改一周的第一天
【发布时间】:2010-10-24 20:38:57
【问题描述】:

我正在尝试用 ruby​​ on rails 构建一个日历。

在 ruby​​-on-rails 中,星期一被认为是一周的第一天,但​​我必须将星期日设置为第一天。我打算更改它以正确使用日期的内置方法 RoR。 假设今天是 10 月 24 日星期日。看例子:

Date.now.beginning_of_week

它打印:2010-10-18;但如果我可以将星期日设置为一周的第一天,它应该打印:2010-10-24

【问题讨论】:

    标签: ruby-on-rails datetime


    【解决方案1】:

    现在该方法接受开始日期参数:

    beginning_of_week(start_day = :monday)
    

    注意:仅 Rails 4.2.7 支持参数

    【讨论】:

    • 不是这样。你在哪里找到的?
    • 就在 Rails API 文档中...api.rubyonrails.org/classes/…
    • 正是我需要的。谁使用任何东西
    • 和 end_of_week(start_day = :sunday) 的工作方式相同。
    【解决方案2】:

    我已经成功地向 Rails 发出了拉取请求,现在您可以将符号参数传递给 beginning_of_week 方法。例如beginning_of_week(:sunday) 会给你一个星期天假设星期从星期日开始。 end_of_week 方法也是如此。但是你必须等到 rails 3.2 发布,以防你不在最前沿。

    有关更多信息,请参阅此内容: https://github.com/rails/rails/pull/3547

    【讨论】:

    【解决方案3】:

    您可以通过执行以下操作在 api 中工作:

    ree-1.8.7-2011.02 :004 > DateTime.now.beginning_of_week
     => Mon, 30 May 2011 00:00:00 -0400 
    ree-1.8.7-2011.02 :005 > DateTime.now.beginning_of_week.advance(:days => -1)
     => Sun, 29 May 2011 00:00:00 -0400 
    

    编辑:

    在最后几分钟考虑到这一点,Rails 以这种方式接近它是有充分理由的。您必须有一个默认的一周开始,并传入这个可选参数,您现在可以将一周的开始存储在数据库中的 User 表中,并允许用户选择一周中的哪一天开始他们的周,例如:

    first_day_of_calendar_week = {:default => 0, :monday => 0, :sunday => -1 ..}
    ....
    @user = User.find_by_some_attribute(...)
    DateTime.now.beginning_of_week.advance(
      :days => first_day_of_calendar_week[@user.choice] || first_day_of_calendar_week[:default])
    

    【讨论】:

    • 如果您的日期是星期日,那么 DateTime.now.beginning_of_week.advance(:days => -1) 这将导致当前日期前一周和一天。
    【解决方案4】:

    我不知道它是不是新东西,但现在(Rais 4.2.5 - Ruby 2.2.3)你可以设置Date.beginning_of_week = :sunday。我试图在config/application.rb 上设置它,但不知何故它不能正常工作,可能在每个新请求时都会重置。然后我把它放在我的ApplicationController 中的before_action 上,效果很好。

    【讨论】:

    【解决方案5】:

    将此config 添加到config/application.rb

    config.beginning_of_week = :sunday
    

    【讨论】:

      【解决方案6】:

      如果您查看https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/calculations.rb#L178,您会发现星期一被硬编码为第一天。山姆的回答很好。

      【讨论】:

        【解决方案7】:

        如果您不想更改 API,您可以在日期前加上“6”天。我不确定你为什么想要'6',但这就是你的问题。

        Time.now.beginning_of_week + 6.days
        

        helper.rb

        def format_date(time)
           time.now.beginning_of_week + 6.days
        end 
        

        查看

        <%= format_date(Time.now) %>
        

        【讨论】:

        • 这是一个使用示例。您的解决方案的问题是,每次我想使用 begin_of_week 和 end_of_week 时我都必须这样做
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 2020-12-25
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多