6

Time オブジェクト T があります。T に N 日を追加する合理的な方法は何ですか?

私が思いついた最高のものは、やや苦しめられているように感じます:

require 'date'
def add_days(time, days)
  time.to_date.next_day(days).to_time
end

PS: あなたが米国にいる場合、正解は以下を満たす必要があります。

add_days(Time.new(2013, 3, 10, 0), 1) == Time.new(2013, 3, 11, 0)

また、EU 内にいる場合、正解は次の条件を満たす必要があります。

add_days(Time.new(2013, 3, 31, 0), 1) == Time.new(2013, 4, 1, 0)

PPS: これは Rails の質問ではなく、Ruby の質問です。

4

4 に答える 4

11

Time秒を受け入れる+メソッドがあります。

N = 3

t = Time.now + N * 86400 # 24 * 60 * 60 

または、ActiveSupport を導入すると、より簡単になります

require 'active_support/core_ext'

t = Time.now + N.days

あなたは明らかにあなた自身のヘルパーを作ることができます

class Fixnum
  def days
    self * 86400
  end
end

t = Time.now # => 2013-01-31 16:06:31 +0700

t + 3.days # => 2013-02-03 16:06:31 +0700
于 2013-01-31T09:02:16.673 に答える
6

私のスタイルになっているように見えますが、私は自分の質問に答えています。

DST / ST間の移行は非常にまれであるため(世界の多くの地域では存在しない)、より効率的なアプローチは、最初に(n_days * 24 * 60 * 60)秒を追加してから、UTCオフセットが変更されたかどうかを確認することです。ある場合は、修正された時間オブジェクトを作成します。

このような:

def add_days(time, n_days)
  t2 = time + (n_days * 24 * 60 * 60)
  utc_delta = time.utc_offset - t2.utc_offset
  (utc_delta == 0) ? t2 : t2 + utc_delta
end

このアプローチは、多くの余分なオブジェクトの作成を回避し、夏時間全体の遷移を適切に処理します(少なくとも現在のタイムゾーンである太平洋時間では)。

>> t1 = Time.new(2013, 3, 10, 0, 0, 0)
=> 2013-03-10 00:00:00 -0800  # midnight Mar 3, 2013 Pacific Standard Time
>> t2 = add_days(t1, 1)
=> 2013-03-11 00:00:00 -0700  # midnight Mar 4, 2013 Pacific Daylight Time
>> t2 - t1
=> 82800.0                    # a shorter than usual day

>> u1 = Time.new(2013, 11, 3, 0, 0, 0)
=> 2013-11-03 00:00:00 -0700  # midnight Nov 3, 2013 Pacific Daylight Time
>> u2 = add_days(u1, 1)
=> 2013-11-04 00:00:00 -0800  # midnight Nov 4, 2013 Pacific Standard Time
>> u2 - u1
=> 90000.0                    # a longer than usual day
于 2013-01-31T17:29:48.303 に答える
2

これはやや横方向の回答ですが、元の質問では の HMS セクションについて心配していなかったので、代わりにオブジェクトTimeを使用したほうがよいのではないでしょうか?Date

require 'date'
t=Time.now
d=Date.parse(t.to_s)
puts d+1 # => gives you tomorrow's day (YMD)

編集:require 'date'コメントセクションで指摘されているように、回答の包括性を向上させるために追加されました。

于 2013-12-06T02:41:47.580 に答える