【问题标题】:change the number of week by the range of dates in bash通过bash中的日期范围更改周数
【发布时间】:2013-05-30 19:00:25
【问题描述】:

我需要通过日期范围更改一年中的周数,例如

我有 2013 年第 46 周

日期范围是:

2013-11-11
2013-11-12
2013-11-13
2013-11-14
2013-11-15
2013-11-16
2013-11-17

我不知道我可以用 bash 做吗

数字是脚本的参数,例如如果脚本调用你使用的 convertir.sh

convertir.sh 2013 46

其中 2013 年是一年,46 是一年中的一周 并且脚本的输出是日期范围

【问题讨论】:

  • 周数在哪里?提供脚本的当前输出和脚本所需的输出。
  • 您的其他帖子中的明智答案有什么问题? stackoverflow.com/questions/16842168/…
  • 数字是脚本的参数例如如果脚本调用convertir.sh你使用convertir.sh 2013 46,脚本的输出是日期范围

标签: linux bash shell sh


【解决方案1】:

这将在带有 bash 的 linux 上工作,假设“周数”是指 ISO 周数。 ISO 周从星期一开始,如果一周中有四天在一年中,则一周计为一年的一部分。

dates_for_week() {
  printf "January 1 $1 %+d days\n" {-3..368} |
    date +%G%V_%Y-%m-%d -f - |
    grep $(printf %d%02d $1 $2) |
    cut -c8-
}

编辑:这是一个为了获得相同结果而做的工作更少的版本:

dates_for_week () { 
  printf "$1-01-01 +$2 weeks %+d days\n" {-10..2} |
    date +%V_%Y-%m-%d -f - |
    grep '^0\?'$2_ |
    cut -c4-
}

例如:

$ dates_for_week 2013 1
2012-12-31
2013-01-01
2013-01-02
2013-01-03
2013-01-04
2013-01-05
2013-01-06
$ dates_for_week 2013 46
2013-11-11
2013-11-12
2013-11-13
2013-11-14
2013-11-15
2013-11-16
2013-11-17
$ dates_for_week 2013 52
2013-12-23
2013-12-24
2013-12-25
2013-12-26
2013-12-27
2013-12-28
2013-12-29

【讨论】:

  • @glennjackman:添加了一个更好的版本。请注意,您可以改进答案的一种方法是观察 1 月 4 日总是在一年中的第 1 周,或者换句话说,mondayOfWeek1 是不迟于 1 月 4 日的最后一个星期一,我认为是 date -d $(printf "$year-01-04 -%d days" $(date +%w -d $year-01-03))
  • 为什么会有这么多数字?
  • @BenitoCamelas:1 月 4 日必须在第 1 周,因此第 1 周必须包含在 [1 月 4 日 - 6 天,1 月 4 日 + 6 天] 中。周i 的范围为[Jan 4 + (i-1)*7 - 6 days, Jan 4 + (i-1)*7 + days]。通过简单的算术,可以转化为[Jan 1 + i*7 - 10 days, Jan 1 + i*7 + 2 days],这样更方便。
  • 为什么你用 grep '^0\?'$2_ 做 grep ? , 用命令 grep -i $2? 比较容易,不然我看不懂你的 grep... =(
  • @BenitoCamelas:您应该能够通过在 bash 提示符下键入 man date 来获取有关 date 选项的一些信息。如果您安装正确,您将通过键入info date 获得更多详细信息。这些工具应该适用于几乎所有命令行实用程序。 -f 表示“从文件中一次读取一行日期”,- 作为文件名表示标准输入。 grep 选项-i 的意思是“不区分大小写”,并且在此处不起作用,因为该模式仅由数字组成。我锚定了模式,使1_11_ 不匹配。
【解决方案2】:

我喜欢这样的问题。需要 GNU 日期:

function mondayOfWeek1 {
    local year=$1 weeknum dayofweek adj=0
    # iso week num and day of week
    read weeknum dayofweek < <(date -d "$year-01-01" +"%V %w")
    # adjust based on wk num
    (( weeknum != 1 && $dayofweek >= 1)) && (( adj += 7 ))
    # adjust based on day of week
    (( adj += 1 - dayofweek ))
    date -d "$year-01-01 + $adj days" +"%Y-%m-%d"
}

function mondayOfWeek {
    local week=$1
    local year=${2-$(date +%Y)}
    date -d "$(mondayOfWeek1 $year) + $((week - 1)) weeks" +"%Y-%m-%d"
}


monday=$(mondayOfWeek 46)
for day in {0..6}; do 
    date -d "$monday + $day days" +"%Y-%m-%d"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多