args(年、月)を使用して新しいオブジェクトDate.newを作成しました。rubyを作成した後、デフォルトでこのオブジェクトに01日数が追加されました。最初の日ではなく、argとして渡した月の最後の日を追加する方法はありますか(たとえば、02monthの場合は28、01monthの場合は31)?
6 に答える
使用する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
月末を取得するには、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ドキュメントをご覧ください。
だから私はここで同じことをグーグルで検索していました...
上記に満足していなかったので、RUBY-DOCのドキュメントを読んだ後の私の解決策は次のとおりです。
取得する例10/31/2014
Date.new(2014,10,1).next_month.prev_day
これは私のTime
ベースのソリューションです。Date
上で提案されたDate
解決策は何とかよく読めますが、私はそれに比べて個人的な好みがあります。
reference_time ||= Time.now
return (Time.new(reference_time.year, (reference_time.month % 12) + 1) - 1).day
ところで、12月は、その年が反転していないことがわかります。しかし、12月は常に31日であるため、これは質問には関係ありません。そして2月の年はひっくり返す必要はありません。したがって、年を正しくする必要がある別のユースケースがある場合は、年も変更するようにしてください。
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?