我想打印一年中 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 来排除美国日期格式和其他日期格式之间的任何混淆,正如您在上面的脚本中看到的那样。