查找一年中所有星期日的日期的脚本

查找一年中所有星期日的日期的脚本

我想打印一年中 54 个星期日的日期。我写了下面的脚本,但在输出中出现错误

脚本:

req_date=`date +%m%d%Y`

for i in {1..54}

do
   NEXT_DATE=$(date +%m%d%Y -d "$req_date +  7*$i day")
   echo "$NEXT_DATE"
done

输出

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*32 day'
date: invalid date ‘11132019 +  7*32 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*33 day'
date: invalid date ‘11132019 +  7*33 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*34 day'
date: invalid date ‘11132019 +  7*34 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*35 day'
date: invalid date ‘11132019 +  7*35 day’
+ NEXT_DATE=
..

有人可以帮我弄这个吗 ?

答案1

ksh93

printf '%(%Y-%m-%d)T\n' '2020-01 '{1..52}'th Sunday'

将为您提供 2020 年所有 52 个星期日的列表(采用更有用且明确的格式,但如果您真的(真的?)想要的话,YYYY-MM-DD您可以随时更改为)。%m%d%Y

printf '%(%Y-%m-%d)T\n' '2023-01 '{1..53}'th Sunday'

2023 年的 53 个。

一年不可能有 54 个星期日。

一年可以有54其中两个未完成,这就是为什么date +%W可以取值 00 到 53,但第 00 周或第 53 周的至少一个星期日将在相邻的一年中(并且第 00 周或第 53 周可能属于一年以上;与ISO 周数 ( %V) 避免了它并从 01 到 53)。

答案2

我的答案是从开始日期到 30 周之间的所有星期四,使用顺序选择第一个星期四

paul@debian:~$         
strt="2023/06/01"
for i in `seq 0 30`;
        do
                echo "datum  $i $(date -d "${strt}+${i} week  " +"%A/%d/%m/%Y" )"
        done

datum  0 Thursday/01/06/2023
datum  1 Thursday/08/06/2023
datum  2 Thursday/15/06/2023
datum  3 Thursday/22/06/2023
datum  4 Thursday/29/06/2023
datum  5 Thursday/06/07/2023
datum  6 Thursday/13/07/2023
datum  7 Thursday/20/07/2023
datum  8 Thursday/27/07/2023
datum  9 Thursday/03/08/2023
datum  10 Thursday/10/08/2023
datum  11 Thursday/17/08/2023
datum  12 Thursday/24/08/2023
datum  13 Thursday/31/08/2023
datum  14 Thursday/07/09/2023
datum  15 Thursday/14/09/2023
datum  16 Thursday/21/09/2023
datum  17 Thursday/28/09/2023
datum  18 Thursday/05/10/2023
datum  19 Thursday/12/10/2023
datum  20 Thursday/19/10/2023
datum  21 Thursday/26/10/2023
datum  22 Thursday/02/11/2023
datum  23 Thursday/09/11/2023
datum  24 Thursday/16/11/2023
datum  25 Thursday/23/11/2023
datum  26 Thursday/30/11/2023
datum  27 Thursday/07/12/2023
datum  28 Thursday/14/12/2023
datum  29 Thursday/21/12/2023
datum  30 Thursday/28/12/2023

答案3

这是您更正后的脚本。

  • 请求日期正确的是 dd/mm/yyy 和下周日
  • 在日期偏移计算中使用 bash 语法
  • 在索引 0 而不是 1 处开始循环,因此在 53 而不是 54 处结束循环。
req_date=`date +%m/%d/%Y -d sunday`

for i in {0..53}
do
    NEXT_DATE=$(date +%m%d%Y -d "$req_date +  $((7*i)) days")
    echo "$NEXT_DATE"
done

答案4

为了避免第 0 周或第 54 周出现问题 - 根据您的标准,您可以循环所有日期并选择所有星期日:

#!/bin/bash

#get day of year number for last day of year
total_days=$(date -d'2019-12-31' +%j)

#loop over all days and select Sundays
for (( i=0 ; i<${total_days} ; i++ )) ; do
  date -d"2019-01-01 + ${i}" +"%a %Y-%m-%d" | grep Su | cut -d' ' -f2
done

req_date您还必须使用该选项在一年中的所有星期日指定开始日期-d。 (除非您希望以接下来的 54 个星期日为req_date起点。)


关于您问题中指定的问题:

正如评论中已经提到的,您的输入格式是错误的。可能的日期输入字符串解释起来有点复杂,而且也不直观,所以有些扩展,但在 中详细解释info "date input formats"。这是一个很长的描述。由于您不使用连字符或斜杠,因此这里仅来自

29.8 日期字符串中的纯数字

如果十进制数的格式为 YYYYMMDD 并且在日期字符串中没有其他日历日期项(*注日历日期项::)出现在其前面,则 YYYY 将被读取为年份,MM 将被读取为月份数字,DD 将被读取为日期指定日历日期的月份。

因此,您的日期11132019是 1113 年 20 月 19 日,该日期不存在,因此失败。

就我个人而言,我更喜欢使用 yyyy-mm-dd 来排除美国日期格式和其他日期格式之间的任何混淆,正如您在上面的脚本中看到的那样。

相关内容