2016-09-19 6 views
0

電子メールをサプライヤに送信するための私のロジックの一部は、電子メールを送信するために約束日が今日の日付よりも短くなければならないということです。どんな理由であれ、それは偽でなければならないとしても、真実であると考えています。私はコンソールでそれをテストし、それは偽を示しますが、それは電子メールを送信する...だから、私はそれが本当に通り過ぎていると推測しています。時間変換Ruby on Rails 4が動作しない

def self.send_vendor_openorder_notification(user, vendor) 
    po_collection = Array.new 
    user.purchase_orders.where({open_order: true, vendor_number: vendor.vendor_number}).where.not(email_last_sent: Time.now.midnight).each do |x| 
     if x.promise_date == nil || DateTime.strptime(x.promise_date, '%m/%d/%y') + 7.hours < Time.now.midnight 
     if x.email_sent == false 
      po_collection << x.id 
      x.email_sent = true 
      x.email_last_sent = Time.now.midnight 
      x.save 
     end 
     end 
    end 
    if po_collection.empty? == false 
     VendorSender.open_order_sender(user, vendor, po_collection).deliver_later 
    end 
    end 

ここで、promise_dateがnilまたは今日よりも深夜になると、それは合格するはずです。しかし、「09/19/2016」の約束事日は、2014年9月19日に合格となります。 herokuコンソール(これはHerokuを通じて展開されています)では、これは間違っています...私はここで何が欠けていますか?

irb(main):038:0> DateTime.strptime("09/19/16", '%m/%d/%y') + 7.hours < Time.now.midnight 
=> false 
irb(main):039:0> DateTime.strptime("09/19/16", '%m/%d/%y') + 7.hours 
=> Mon, 19 Sep 2016 07:00:00 +0000 
irb(main):040:0> Time.now.midnight 
=> 2016-09-19 00:00:00 -0700 
irb(main):041:0> 
+0

両方の日付がまったく同じで、Time.now.midnightがDateTime.strptimeよりも低いかどうかを尋ねるので、falseが返されます。 – luissimo

+0

@luissimo正しいですが、日付は同じですが、タイムゾーンは異なります。 –

+0

私はそれが偽を返すようにしたい。問題は、実際に.zoneが働いて – Doughtz

答えて

3

問題はあなたのTimeZoneにあると思います。

Time.nowの代わりに常にTime.zone.nowを使用してください。詳細についてはClick hereをご覧ください。

ifのように条件を変更することができます。

x.promise_date == nil || (Time.zone.parse(x.promise_date.strftime('%Y-%m-%d'))) + 7.hours < Time.zone.now.midnight 

希望します。

+0

を返していることです。 – Doughtz

関連する問題