【发布时间】:2012-12-16 17:42:59
【问题描述】:
我使用 args(年、月)创建了新对象 Date.new。创建 ruby 后默认为该对象添加 01 天数。有没有办法添加我作为 arg 传递的月份的最后一天而不是第一天(例如,如果是 02 月,则为 28,如果是 01 月,则为 31)?
【问题讨论】:
我使用 args(年、月)创建了新对象 Date.new。创建 ruby 后默认为该对象添加 01 天数。有没有办法添加我作为 arg 传递的月份的最后一天而不是第一天(例如,如果是 02 月,则为 28,如果是 01 月,则为 31)?
【问题讨论】:
使用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,我知道你已经可以理解参数了=)
要获得月底,您还可以使用 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 完美,方法days,months 也可以像rails 一样工作,非常感谢。
end_of_month 在 rails 4 中不需要任何东西
require 'active_support'。 edgeguides.rubyonrails.org/active_support_core_extensions.html
所以我在这里在谷歌搜索同样的东西......
我对上面的内容不满意,所以在阅读文档后我的解决方案 在RUBY-DOC 是:
获取10/31/2014的示例
Date.new(2014,10,1).next_month.prev_day
【讨论】:
Date.new(2016, 3, 4).next_month.prev_day = Sun, 03 Apr 2016
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")
这是另一种查找方式
【讨论】:
你可以这样做:
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?
【讨论】:
这是我基于Time 的解决方案。与Date 相比,我个人更喜欢它,尽管上面提出的Date 解决方案读起来更好。
reference_time ||= Time.now
return (Time.new(reference_time.year, (reference_time.month % 12) + 1) - 1).day
顺便说一句,十二月你可以看到那一年没有翻转。但这与问题无关,因为 12 月总是有 31 天。并且对于二月年不需要翻转。因此,如果您有另一个需要正确年份的用例,请确保也更改年份。
【讨论】: