2016-02-29 27 views
5

Bugün 29 Şubat: testlerimiz bozuldu.Rails TimeWithZone ve geçen yıllar

Testlerimiz başarısız oluyor çünkü bu testler sonuçta şu gibi bir komutla karşılaştırılabilir: Time.zone.now - 1.year + 1.year. Ve Time.zone.now'a eşittir.

Bu neden oluyor? ActiveSupport neden böyle hesaplamalarda geçen yılları yönetemiyor? Zaman damgasıyla çalışmıyor mu, bu tür bir problemin olmasını engelliyor mu?

+0

bugün bunu test ediyorsanız, bir kötü şans ... Bugün sadece 4 yılda mevcut Şubat 29. olduğunu var. Bu yüzden 29 Şubat 2017 için mevcut değil çünkü 'time.zone.now' +' 1.year' 28 Şubat'a alacaksınız. '' 1.year.from_now' da 28 Şubat’a dönecek – MrYoshiji

+0

Evet bunu anladım. Ama neden Time.zone.now + 1.year' gibi 1 Mart’a eşit değil? Benim düşünceme göre daha uygun olurdu. – Guilherme

+1

Time.zone.now - 365.days + 365.days çalışmış gibi görünüyor ... – tobmatth

cevap

0

Aynı etki için 1 yerine 4 yıl kullanabilirsiniz. (Not: - 1.gün şu anda 1 Mart olduğu için)

(Time.zone.now - 1.day) - 4.year + 4.year 
=> Mon, 29 Feb 2016 15:12:58 UTC +00:00 

O (aşağıda) dikkati olabilir, tarihten bağımsız.

Time.zone.now 
=> Tue, 01 Mar 2016 15:11:51 UTC +00:00 
Time.zone.now == Time.zone.now - 1.year + 1.year 
=> false 

Eğer beginning_of_day kullanmadıkça: Ayrıca

(Time.zone.now - 1.day).beginning_of_day == ((Time.zone.now - 1.day) - 4.year + 4.year).beginning_of_day 
=> true 

, bu Time.now - 1.year + 1.year test etmek isteyeyim Neden aslında ... yapmaya çalışıyor ne bağlıdır? Ayrıca

...

1.year == 365.days 
=> false 
1.year == 365.25.days 
=> true 
+0

'Time.zone.now == Time.zone.now - 1.year + 1.ear' asla çalışmaz, Bir değişkende 'time.zone.now' sakla. – Guilherme

+0

Evet, doğru, ama tarih için çalışıyor: 'Date.today == Date.today - 1.year + 1.year' – Jaliso