如何使用date命令找出“ 40号星期一”的日期?


11

如何使用date命令将“ 40号星期一”转换为ISO日期?

我在玩这样的游戏:

date --date='monday week 40' +'%Y-%m-%d'

我要搜索的日期是2011-10-03。

但是我的问题是此日期字符串无效,因此我需要另一种方法来解决此问题。

/谢谢


以下链接是关于确定编号的星期几在一年中的哪一天开始的。周编号(Wikipedia) ..它有效地解释了为什么今年1月1日位于ISO周52中。“用户未知”%V使用的格式顺序报告了ISO周编号。
Peter.O 2011年

Answers:


4

真的很丑,可能只适用于GNU date

date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'

仅针对10月3日的示例进行了测试,在某些其他情况下可能会失败。


更新:如果您有非英语语言环境,则需要指定内部日期的输出才能开始工作。(%F只是YYYY-MM-DD)。

date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"

1
您错过了根据内部日期格式化输出的信息,因此外部日期可以正确使用它。
约翰

@Johan,使用默认格式没有问题。也许是特定于语言环境的?我使用en_US。反正好点。
manatwork's

对于我使用瑞典语言环境的日期,有区别。
约翰

感谢您调整语言环境。我有一个自定义的日期格式,并且遇到了同样的问题。更好
Peter.O 2011年

并不需要单线。最好使用带有描述性名称的临时变量将其分成多行,以明确其工作方式。它还假定1月1日是在同一个星期数量每年,这是不是这样的已经被@ Peter.O指出。
亚当·斯皮尔斯

5

替代方法:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40周是您要搜索的周
  • date +%V返回当前星期(35)
  • 40-35 = 5,这是要添加的周数
  • 从那里寻找最后一个星期一

不错,它可以与我的自定义日期设置配合使用。
Peter.O 2011年

这是一个聪明的主意,但却行不通。例如,如果今天是第41周的星期一(即date +%Vreturn 41),则--date参数值将是+-1weeks last monday,实际上是两周前,而不是7天前。
亚当·斯皮尔斯

我不确定我是否理解你的批评。今年是2013年,因此问题中的示例不适合。该问题的绝对日期应该是什么,我的方法将返回什么(也许是:为什么)?
用户未知

@AdamSpiers:我的日历显示为9月30日(第40周),这是我的算法(今天)的收益。
用户未知

@userunknown那是因为您今天要测试代码,这是星期一之后的星期二。如果您昨天测试过代码,它就会崩溃。为了使其更加明显,请尝试运行date -d 'last monday'。它将在昨天返回。如果您昨天运行它,您认为它会怎么说?
亚当·斯皮尔斯

1

好,这是我的尝试。它从其他答案中窃取了想法,并试图使逻辑更易于遵循。这是基于ISO 8601系统的,因此,如果您居住在美国或加拿大等国家,那将是不正确的,但应该可以轻松地针对这些国家进行调整。

# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
    week_num="$1" date_format="$2"

    # Most of the world adhere to ISO 8601 which states that weeks begin on Monday
    # and Jan 4th is always in week #1:
    #
    #   http://en.wikipedia.org/wiki/ISO_week_date
    #
    # For other week numbering systems (e.g. USA, Canada), see:
    #
    #   http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
    day_in_week_1=$( date +'%Y-01-04' )
    day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
    days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
    # This is a Monday:
    start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )

    week_delta="$(( $week_num - 1 ))"
    # Monday:
    week_start=$( date -d "$start_of_week_1 + $week_delta weeks"          +"$date_format" )
    # Friday:
    week_end=$(   date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.