2011-07-16 201 views
20

最好的紅寶石,但邏輯是不夠好......週數年,還挺

我需要考慮到本週是非標準一年的週數。所以,假設你定義一個星期爲星期六 - >星期五。那麼,給定一個日期,哪個星期的數字(1-52)是?

的strftime有%U:

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

...但是,這當然是假定標準週日 - >週六的一週。

+0

也許使用這個標準,然後根據今天的星期幾來計算你自己的偏移... – Randy

+14

星期日 - >星期六隻是美國標準。國際標準是星期一 - >星期日。 – sawa

回答

2

也許可以這樣做;

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

查找給定日期的週數。 – 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

不錯,但是對於修補核心類的猴子來說+0,奇怪的是btw'Time.new。strftime('%W')!= Time.new.to_date.cweek' – akostadinov

+2

@akostadinov:你現在可能已經很久以前了,但是爲了後代,'Time.new.strftime('%W')'返回一個String 'Time.new.to_date.cweek'返回一個整數,所以它們不會相等。 – ray

20

使用%W而不是%U,它使用星期一作爲一週的第一天。

Time.now.strftime('%W') 
+1

但它是零索引,而不是'Date.today.cweek' form @ fl00r的答案。 –

1

我們可以弄清楚如何考慮這個日曆片段從什麼用%U(太陽一週開始)返回的週數的偏移:

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

讓我們的方式,我們希望有一個Wed-星期二,縮寫爲格式%?(所以我們不必輸入「星期三開始一週」)。

我們希望:

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

通知我們如何薩留在兩個系統中相同的週數,而本週的所有其他天%?被移動到前一週持平。

因此,我們可以這樣做:

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] 
} 

如果你想週六至週五一週,你可以減去1天是不是星期六:

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

注意,有一對夫婦邊緣的情況下,取決於你選擇你的一週(處理這些留給讀者的練習)。對於我們的週三,週二周:

  • 2014年開始與週三,但我們的算法使1月1日0星期,但它應該是1周(%U把1月1日在1,如果是星期天爲一週)。
  • 2007年(以及其他年來在週一或週二開始)將導致第一個星期三以前的日子是在-1周,但他們應該是本週0

一週的幾天你重新調整,你會有更多的邊緣情況。週六到週五可能會遇到最多的問題,因爲您在7天內調整了6天。