【问题标题】:week number of the year, kinda一年中的第几周,有点
【发布时间】:2011-10-06 22:29:21
【问题描述】:

最好在 ruby​​ 中,但逻辑会足够好......

鉴于周是非标准的,我需要一年中的周数。因此,假设您将一周定义为星期六 -> 星期五。那么,给定一个日期,它是哪个周数(1-52)?

strftime 有 %U:

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

...但这当然是假设一个标准的周日 -> 周六周。

【问题讨论】:

  • 也许使用这个标准,然后根据今天的星期几计算你自己的偏移量......
  • 星期日 -> 星期六只是美国标准。国际标准是星期一 -> 星期日。

标签: ruby date time


【解决方案1】:

使用%W 而不是%U,它将星期一作为一周的第一天。

Time.now.strftime('%W')

【讨论】:

  • 但它是零索引,而不是 Date.today.cweek 形式 @fl00r 的答案。
【解决方案2】:
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 用于猴子修补核心类,奇怪的是 Time.new.strftime('%W') != Time.new.to_date.cweek
  • @akostadinov:你可能很久以前就知道了,但是对于后代,Time.new.strftime('%W') 返回一个字符串,而Time.new.to_date.cweek 返回一个整数,所以它们不应该是相等的。
【解决方案3】:

也许可以这样做;

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

【讨论】:

  • 查找给定日期的周数。
【解决方案4】:

通过考虑这个日历片段,我们可以弄清楚如何从%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

假设我们想要一个周三至周二的一周,缩写为 %? 格式(因此我们不必输入“周三开始周”)。

我们想要:

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

注意 We-Sa 如何在两个系统中保持相同的周数,而一周中的所有其他日子在 %? 中移动到前一周。

所以我们可以这样做:

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 天要调整。

【讨论】:

    【解决方案5】:

    如果您想要ISO week number,请根据strftime documentation 使用 %V

    例子:

    require 'date'
    
    puts DateTime.parse('2018-12-30 23:59:59').strftime('%G-%V')
    puts DateTime.parse('2018-12-31 00:00:00').strftime('%G-%V')
    

    结果:

    2018-52
    2019-01
    

    请注意,它用于年份的 %G 而不是 %Y。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多