【问题标题】:Get last day of the month in Ruby在 Ruby 中获取本月的最后一天
【发布时间】:2012-12-16 17:42:59
【问题描述】:

我使用 args(年、月)创建了新对象 Date.new。创建 ruby​​ 后默认为该对象添加 01 天数。有没有办法添加我作为 arg 传递的月份的最后一天而不是第一天(例如,如果是 02 月,则为 28,如果是 01 月,则为 31)?

【问题讨论】:

    标签: ruby date datetime


    【解决方案1】:

    使用Date.civil

    使用Date.civil(y, m, d) 或其别名.new(y, m, d),您可以创建一个新的日期对象。日 (d) 和月 (m) 的值可以为负数,在这种情况下,它们分别从年末和月末倒数。

    => Date.civil(2010, 02, -1)
    => Sun, 28 Feb 2010
    >> Date.civil(2010, -1, -5)
    => Mon, 27 Dec 2010
    

    【讨论】:

    • 谢谢,我用这种方式18] pry(main)> Date.new(2012,11,-1) => Fri, 30 Nov 2012
    • 还有一个问题,有什么方法可以得到一个月的天数吗?
    • 是的,你可以使用Date.new(year, month, -1).day,我知道你已经可以理解参数了=)
    【解决方案2】:

    要获得月底,您还可以使用 ActiveSupport 的助手end_of_month

    # Require extensions explicitly if you are not in a Rails environment
    require 'active_support/core_ext' 
    
    p Time.now.utc.end_of_month # => 2013-01-31 23:59:59 UTC
    p Date.today.end_of_month   # => Thu, 31 Jan 2013
    

    您可以在 Rails API 文档中找到更多关于 end_of_month 的信息。

    【讨论】:

    • require 'active_support/core_ext 完美,方法daysmonths 也可以像rails 一样工作,非常感谢。
    • 在主动支持 4.2.4 中找不到它。看起来已经过时了。
    • @ZekeFast 我认为 end_of_month 在 rails 4 中不需要任何东西
    • 根据文档,你必须先做一个require 'active_support'edgeguides.rubyonrails.org/active_support_core_extensions.html
    【解决方案3】:

    所以我在这里在谷歌搜索同样的东西......

    我对上面的内容不满意,所以在阅读文档后我的解决方案 在RUBY-DOC 是:

    获取10/31/2014的示例

    Date.new(2014,10,1).next_month.prev_day

    【讨论】:

    • 另外澄清一下,我只使用 Ruby... 不是 rails 所以我不能使用任何辅助函数。
    • 它不工作。 Date.new(2016, 3, 4).next_month.prev_day = Sun, 03 Apr 2016
    • @RandyTek 您看到的返回值对于您在评论中使用的输入值是正确的。格式为 Date.new(year,month,day)。您从 2016 年 3 月 4 日开始。 'next_month' 方法将其移至 2016 年 4 月 4 日。 'prev_day' 方法返回 2016 年 4 月 3 日。你想达到什么结果?
    • 我认为问题是如何获得一个月的最后一天。不是前一天。因此,如果我从 2016 年 3 月 4 日(MM/DD/YYYY)开始,预期的结果应该是 2016 年 3 月 31 日而不是 2016 年 4 月 3 日。您可能可以参考@Thomas Klemm 的答案。
    • @RandyTek 对,我们的目标是获得本月的最后一天。因此,方法调用将是 Date.new(2016,3,1).next_month.prev_day 使用我的示例,而不是 Date.new(2016,3,4) 就像您在 3 月 25 日的评论中提到的那样。请注意,您需要在实例化新的 Date 对象时更改日期值。像这样的东西:link。请注意,当我最初发布我的解决方案时,我在第一条评论中提到我没有使用 Rails。如果您使用的是 rails,Klemm 先生的回答会更简单,因为它已经实现了
    【解决方案4】:
    require "date"
    def find_last_day_of_month(_date)
     if(_date.instance_of? String)
       @end_of_the_month = Date.parse(_date.next_month.strftime("%Y-%m-01")) - 1
     else if(_date.instance_of? Date)
       @end_of_the_month = _date.next_month.strftime("%Y-%m-01") - 1
     end
     return @end_of_the_month
    end
    
    find_last_day_of_month("2018-01-01")
    

    这是另一种查找方式

    【讨论】:

      【解决方案5】:

      你可以这样做:

      def last_day_of_month?
         (Time.zone.now.month + 1.day) > Time.zone.now.month
      end
      
      Time.zone.now.day if last_day-of_month?
      

      【讨论】:

        【解决方案6】:

        这是我基于Time 的解决方案。与Date 相比,我个人更喜欢它,尽管上面提出的Date 解决方案读起来更好。

        reference_time ||= Time.now
        return (Time.new(reference_time.year, (reference_time.month % 12) + 1) - 1).day
        

        顺便说一句,十二月你可以看到那一年没有翻转。但这与问题无关,因为 12 月总是有 31 天。并且对于二月年不需要翻转。因此,如果您有另一个需要正确年份的用例,请确保也更改年份。

        【讨论】:

        • @shashwat,很有趣,我想我已经测试过了。但是现在我检查了最新的红宝石并且失败了。我更新了答案以使其与最新的 ruby​​ 一起使用。
        猜你喜欢
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2014-03-22
        相关资源
        最近更新 更多