11

Ruby の日付/時刻ヘルパーは便利ですが、矛盾が見つかりました。12.months は 1.year と等しくないようです。1.month を確認すると、30.days に等しいことがわかります。もちろん、12 * 30.days = 360.days であり、実際の 1 年の長さより 5.25 日短いのです。

クライアントが指定した、許可された月数に基づいて Web サイトの特定のコンポーネントへのアクセスを設定したときに、これに遭遇しました。テストを実行すると、36.month の期間が数週間早く期限切れになることがわかりました。解決策は次のようなものでした:

def months_to_seconds(number_of_months)
  ( (number_of_months.to_f / 12) * 1.year).to_i.seconds
end

これは、number_of_months で表される年の端数の秒数を返します。

1.year は秒単位で 365.25 日と等しいのに、1.month が 30 日ではなく 1/12 の秒を返さなかったのはなぜだと思いますか?

誰もこれに遭遇したことがありますか?誰かがより良い解決策を持っていますか?

4

4 に答える 4

25

カレンダー、そして一般的な時間は恣意的なものであり、このような矛盾に満ちています。「月」の標準的な長さはありません。変動は 28 から 31 日の間であり、「日」の標準的な長さは 23 時間から 25 時間のいずれかであり、分でさえどこからでもあり得ます。 「うるう秒」を考慮すると59~62秒。同様に、1 年は 365 日または 366 日、または 1582 年の場合のように 351 日である場合もあります。

2010 年 1 月 3 日から 2011 年 10 月 19 日までの秒数など、特定の間隔に固有の計算を行っていない限り、抽象的な月、日、または年を使用して間隔の長さを知ることはできません。これらのことは、膨大な数の要因に依存しています。

あなたのソリューションはあなたのアプリケーションに適していますが、Rails の用語では、「日」が 24 時間であるのと同様に、簡単にするために「月」は単に 30 日です。

于 2010-11-12T21:28:08.130 に答える
9

はいといいえ:

12 months1 yearこれらは秒に変換されないため、相対間隔として使用する場合と同じです。

t = Time.now
#=> 2010-11-12 22:34:57 0100
t - 1.year == t - 12.months
#=> true

内部的には、これらの間隔は年数、月数、日数の配列として保持されるため、たとえば次のように言えます。

1.year - 12.months
#=> 1 year and -12 months

これは、減算の結果が「1 年とマイナス 12 か月」の間隔になったことを意味します。

しかし、あなたがto_iそれらを正確な秒数に変換する必要があり、誰かが「1か月」は「30日」を意味すると判断しました。これは、他のものと同じくらい適切な近似値です。

それはドキュメントで指摘されています:

上記の例のように使用すると、これらのメソッドは正確な計算を提供しますが、「月」、「年」などの結果が使用前に変換される場合、これは正しくないことに注意する必要があります。

これらの間隔は、ある意味で「遅延評価」と見なすことができると思います。

于 2010-11-12T21:39:16.837 に答える
0

1 年は 12 の個々の月で構成されますが、それらの月のいくつかはサイズが異なります。1 か月が実際には 28、29、30、または 31 暦日である可能性があることを考えると、1 か月の長さの特定の定義は、人が望むものではない可能性があると予想するのが妥当です。

個人的には、ほとんどの場合、1 か月の定義として 4 週間を使用します。この場合、「1か月」のアクセスを許可している場合、アクセスが許可された月の日を保存する傾向があります。次に、月番号を取り、N 月番号後の同じ日に有効期限を付けます。

于 2010-11-12T21:29:57.677 に答える
0
require 'date'

expire_date = Date.today >> 36
puts expire_date #=> 2013-11-12

月を減算する場合は、 << を使用します。

于 2010-11-12T21:34:36.507 に答える