0

私は慢性を使用して、次のように解析された日付オブジェクトを返します。

last_pay_date = Date.parse(Chronic.parse('2011-11-04').strftime("%Y-%m-%d"))
two_weeks_ago = Date.parse(Chronic.parse("two weeks ago").strftime("%Y-%m-%d"))

puts last_pay_date # 2011-11-04
puts last_pay_date.class # Date
puts two_weeks_ago # 2011-10-24
puts two_weeks_ago.class # Date

しかし、私が本当にやりたいのは、last_day_date のような日付オブジェクトに日付を付け、次のように 2 週間前の日付を返すことです。

two_weeks_ago = Date.parse(Chronic.parse("two weeks before #{last_pay_date}").strftime("%Y-%m-%d"))

これは、変数とハードコードの両方を使用して、他の試行と同様に nil を返します。

last_pay_date = Date.parse(Chronic.parse('2011-11-04').strftime("%Y-%m-%d"))
two_weeks_ago = Chronic.parse("two weeks before #{last_pay_date}")
puts two_weeks_ago.class #NilClass
puts two_weeks_ago.nil? #true

two_weeks_ago = Chronic.parse("2 weeks before 2011-11-04 05:00:00")
puts two_weeks_ago.class #NilClass
puts two_weeks_ago.nil?  #true

質問:

  1. 慢性を使用して既存の日付オブジェクトのオフセットを解析できますか? (例: この日付の +14 日前ではなく、14 日前)。

  2. 慢性を使用して、既存の日付のオフセットをまったく解析できますか?

  3. 解決策が慢性的ではない場合でも、これをどのように達成するのが最善ですか?

編集: Rails なしで Ruby 1.9.2 を実行しています。これらは厳格な Ruby スクリプトですが、仕事をするために必要な gem があれば喜んで含めます。

4

1 に答える 1

1

まず、これは Ruby 1.8 ですか、それとも 1.9 ですか? 1.9 の場合はDate#strptime、文字列からの日付の解析を非常に簡単にするメソッドが利用可能です。

支払い日が決まったら、慢性疾患がなくても、支払い日から 2 週間早くするのはとても簡単です。

Date.strptime("11/7/2011", "%m/%d/%Y").next_day(-14)

これが Ruby 1.8 の場合、ActiveSupport が利用可能な場合 (つまり、これが Rails アプリの場合)、これを簡単にする Fixnum 拡張機能があります。

last_pay_date - 2.weeks

ただし、利用できないと思います。Ruby 1.8.7 ではDate#next_dayprivate であるため、直接呼び出すことはできませんが、必要に応じて呼び出すことはできます。

Date.parse("11/7/2011").send(:next_day, -14)

プライベート保護をバイパスしてもかまわない場合は、これで問題ありません。

于 2011-11-07T16:12:53.520 に答える