2011-07-16 18 views
20

Tercihen, ama yeterince iyi olurdu mantık ...hafta yılın sayısı yakut içinde tür

Ben hafta standart dışı olduğu göz önüne alındığında yılın hafta numarası lazım. Yani, bir haftayı Cumartesi -> Cuma olarak tanımladığınızı varsayalım. Daha sonra, bir tarih verilen hafta numarası (1-52) nedir?

strftime% U sahiptir:

> Time.now.strftime('%U') 
> => "28" 

... ama tabii bu standart bir Pazar varsayar -> Cumartesi haftası.

+0

Belki bu standardı kullanın ve sonra haftanın günlerine göre kendi ofsetini hesaplayın ... – Randy

+14

Pazar -> Cumartesi sadece Amerikan standarttır. Uluslararası standart pazartesi -> pazar. – sawa

cevap

2

Belki de böyle yapabilir;

def week_dates(week_num) 
    year = Time.now.year 
    week_start = Date.commercial(year, week_num, 1) 
    week_end = Date.commercial(year, week_num, 7) 
    week_start.strftime("%m/%d/%y") + ' - ' + week_end.strftime( 
"%m/%d/%y") 
    end 
+0

Belirli bir tarihin haftalık numarasını arıyorum. – jsharpe

17
class Date 
    def sweek 
    date = self + 1 
    date.cweek 
    end 
end 

# Today is Sunday, 17 July 
Date.today.cweek 
#=> 28 
Date.today.sweek 
#=> 29 
+0

güzel, ama bir çekirdek sınıfı yama için +0, btw garip bir şekilde 'Time.new.strftime ('% W')! = Time.new.to_date.cweek' – akostadinov

+2

@akostadinov: Muhtemelen bu kadar uzun zaman önce aldın, ama posterity için, Time.new.strftime ('% W') 'bir String döndürürken 'Time.new.to_date.cweek' bir Tamsayı döndürür, bu nedenle eşit olmaları beklenmez. – ray

20

Kullanım %W yerine %U, bu haftanın ilk günü olarak Pazartesi kullanır.

Time.now.strftime('%W') 
Bu takvim parçasını dikkate alınarak %U (Güneş hafta başlıyor) tarafından döndürülen yaradığını hafta numarasını kaydırmaya nasıl anlayabiliriz
+1

Ama 'Date.today.cweek' formunun @ fl00r'nin yanıtının tersine sıfıra endeksli. –

1

:

August 2015 Su Mo Tu We Th Fr Sa 1 %U => 30 2 3 4 5 6 7 8 %U => 31 9 10 11 12 13 14 15 %U => 32

edelim yolunu istediğimiz bir Wed- Tue haftası, %? biçiminde kısaltılmıştır (bu nedenle "Wed, hafta başlar" yazmamıza gerek kalmaz).

Biz istiyoruz:

August 2015 We Th Fr Sa Su Mo Tu 1 2 3 4 %? => 30 5 6 7 8 9 10 11 %? => 31 12 13 14 15 %? => 32

Bildirimi nasıl iki sistemde de aynı hafta sayısında Biz-Sa kalmak, haftanın diğer tüm günleri %? önceki haftaya taşınır ise.

yüzden bunu yapabilirsiniz: Eğer Sat-Cum hafta isteseydim

startd = Date.new(2015, 8, 1) 
# show whole month 
pp (startd .. (startd >> 1)-1).map {|d| 
    origw = d.strftime('%U').to_i 
    # Adjust our new week number if not We-Sa: 
    neww = ([3, 4, 5, 6].include?(d.wday) ? origw : origw-1) 
    [d.to_s, origw, neww] 
} 

, değil günlerce 1 çıkarma yapabilirsiniz Cumartesi'yi:

d.wday == 6 ? origw : origw-1 

Not birkaç olduğuna Kenar durumları, haftanızı seçeceğinize bağlı olarak (bunları kullanmak okuyucu için bir egzersiz olarak bırakılmıştır). Bizim Çar-Sal Hafta için:

  • Yıl Çar ile 2014 başlar, ama bizim algoritma (%U haftada 1 bugün Pazar eğer 1 Ocak koyar) haftada 0 yılında Oca 1 koyar ama hafta 1 olmalıdır.
  • Yıl 2007 (ve Mon veya Salı günü başlayacak diğer yaş) hafta içinde olmak ilk Çar günler önce neden olacaktır -1 ancak 0.

hafta haftanın gün daha olmalı sen ayarlıyorsunuz, sahip olacağınız daha fazla kenarlık. Sat-Cum haftası muhtemelen en çok problemi yaşayacaktır çünkü 7 gün içinde 6'yı ayarlıyorsunuz.