2

確かに非常に奇妙なエラー。毎月自分自身のクローンを作成し、将来、次のオブジェクトにscheduled_on日付を設定するアイテムがあります。+ 1.months

しかし、それからこれが起こりました:

Sun, 01 Apr 2012 16:00:00 PDT -07:00
Tue, 01 May 2012 16:00:00 PDT -07:00
Fri, 01 Jun 2012 16:00:00 PDT -07:00
Sun, 01 Jul 2012 16:00:00 PDT -07:00
Wed, 01 Aug 2012 16:00:00 PDT -07:00
Fri, 31 Aug 2012 17:00:00 PDT -07:00 # <--- What in the..

コード :

def clone_object
  objects = []

  Time.zone = account.timezone
  Chronic.time_class = Time.zone

  now = last_scheduled_on.to_time # <- this would have been Wed, 01 Aug 2012 16:00:00 PDT -07:00

  new_date = now + 1.months

  new_schedule = Time.zone.parse new_date.strftime('%Y-%m-%d' + ' ' + original_scheduled_on.strftime('%H:%M:%S'))

  objects << clone!(:scheduled_on => new_schedule, :recurring_job_id => id)

end

これは、実際のコードの非常に切り捨てられたバージョンです。しかし、それは私がこの問題に合理的に影響を与えているすべての部分を含みます。

だから問題は..そのエラーがどのように発生した可能性があるのでしょうか?

アップデート

これはタイムゾーンに関連していると確信しています。

UTCでの日付は次のとおりです。

In UTC :

Sun, 01 Apr 2012 23:00:00 UTC +00:00
Tue, 01 May 2012 23:00:00 UTC +00:00
Fri, 01 Jun 2012 23:00:00 UTC +00:00
Sun, 01 Jul 2012 23:00:00 UTC +00:00
Wed, 01 Aug 2012 23:00:00 UTC +00:00
Sat, 01 Sep 2012 00:00:00 UTC +00:00
Sun, 30 Sep 2012 23:00:00 UTC +00:00

ここでそれらは太平洋に変換されます:

In Pacific

Sun, 01 Apr 2012 16:00:00 PDT -07:00
Tue, 01 May 2012 16:00:00 PDT -07:00
Fri, 01 Jun 2012 16:00:00 PDT -07:00
Sun, 01 Jul 2012 16:00:00 PDT -07:00
Wed, 01 Aug 2012 16:00:00 PDT -07:00
Fri, 31 Aug 2012 17:00:00 PDT -07:00
Sun, 30 Sep 2012 16:00:00 PDT -07:00

また、ここに入力したコードはサーバーに対して正確ではないことにも注意しました。サーバーのTime.zoneは、アカウントのタイムゾーンではなく、最後のジョブに設定されています。これは、タイムゾーンがフローティングで動的であることを意味します(または少なくとも私はそれが意味すると思います)。しかし、カリフォルニアの夏時間は9月ではなく、11月まで切り替わらないため、これも気になります。

4

3 に答える 3

0

.next_monthを試しましたか?http://api.rubyonrails.org/classes/Time.html#method-i-months_since

于 2012-08-02T16:30:24.707 に答える
0

時間の計算には常に問題があります。1.月は、30日、31日、28日、またはその間の任意の日である可能性があります。追加する月、追加する月などによって異なります。したがって、このようなエラーは、日付の計算を行うときに、残念ながら厄介なことによくあることです。

このコードを修正するには、次のように、現在の月の月の初めを選択するようにします。

new_date = (now + 1.months).beginning_of_month

それは常に月の1日です。

于 2012-08-02T16:13:12.630 に答える
0

これが発生する理由は、2つのDateTimeを追加すると、DateTimeオブジェクトが日数で追加され、タイムゾーンの信用が失われるためです。

2つのTimeオブジェクトを一緒に追加すると、時間単位で追加され、タイムゾーンの違いが含まれます。

時間差が発生したのは、特に、タイムゾーンの変更を超えた2つのDateTimeが一緒に追加されたためです。その後、それぞれのタイムゾーンで後で解析されるときに1時間オフセットされるという事実にもかかわらず、時刻はUTCで同じ数値としてデータベースに保存されます。

于 2012-08-14T12:02:23.823 に答える