57

args(年、月)を使用して新しいオブジェクトDate.newを作成しました。rubyを作成した後、デフォルトでこのオブジェクトに01日数が追加されました。最初の日ではなく、argとして渡した月の最後の日を追加する方法はありますか(たとえば、02monthの場合は28、01monthの場合は31)?

4

6 に答える 6

108

使用するDate.civil

Date.civil(y, m, d)またはそのエイリアスを使用.new(y, m, d)して、新しいDateオブジェクトを作成できます。日(d)と月(m)の値は負の値になる可能性があり、その場合、それぞれ年末と月末から逆方向にカウントされます。

=> Date.civil(2010, 02, -1)
=> Sun, 28 Feb 2010
>> Date.civil(2010, -1, -5)
=> Mon, 27 Dec 2010
于 2013-01-02T10:49:16.520 に答える
76

月末を取得するには、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

end_of_monthの詳細については、 RailsAPIドキュメントをご覧ください。

于 2013-01-02T11:59:48.290 に答える
17

だから私はここで同じことをグーグルで検索していました...

上記に満足していなかったので、RUBY-DOCのドキュメントを読んだ後の私の解決策は次のとおりです。

取得する例10/31/2014

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

于 2014-10-10T21:28:42.967 に答える
0

これは私のTimeベースのソリューションです。Date上で提案されたDate解決策は何とかよく読めますが、私はそれに比べて個人的な好みがあります。

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

ところで、12月は、その年が反転していないことがわかります。しかし、12月は常に31日であるため、これは質問には関係ありません。そして2月の年はひっくり返す必要はありません。したがって、年を正しくする必要がある別のユースケースがある場合は、年も変更するようにしてください。

于 2018-05-18T13:48:00.913 に答える
0
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")

これは見つける別の方法です

于 2018-06-27T12:40:45.870 に答える
0

あなたはそのようなことをすることができます:

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?
于 2020-02-18T05:51:25.787 に答える