如何获取特定日期

如何获取特定日期

我的脚本中需要获取当月的第一个星期六的日期。我可以从下面的命令获取上周六的日期

date -d 'last Saturday' +%y%m%d

但无法获得第一个星期六的约会。即使尝试过 date -d 'First Saturday' +%y%m%d 但没有得到预期的结果。

例如,我的要求是 - 当月(七月) - 第一个星期六日期(200704)

谁能帮我获取当月第一个星期六的日期

答案1

ksh93

$ ksh93 -c 'printf "%(%y%m%d)T\n" "first saturday"'
200704

答案2

巴什

缩进命令只是为了更好地理解。

$ target_day_id=6 # return value of date +%w; Sunday is 0
$ year_month="$(date +%Y-%m)"
$     echo $year_month
2020-07
$ day_id="$(date --date="${year_month}-01" +%w)"
$     echo $day_id
3
$ # July, 1st 2020 was a Wednesday
$ sat1_date="${year_month}-0$(( ( (7+target_day_id-day_id) % 7 ) + 1 ))"
$     echo $sat1_date
2020-07-04
$     # only formatting from now on
$ sat1_date_short="${sat1_date:2}"
$     echo $sat1_date_short
20-07-04
$ sat1_date_short_digits_only="${sat1_date_short//-/}"
$     echo $sat1_date_short_digits_only 
200704

答案3

使用 GNU 日期和 shell 循环:

day=1
until [ $(date +%A -d $(date +%Y-%m-$(printf '%02d' "$day"))) = "Saturday" ]
do 
  ((day++))
done
date +%y%m$(printf '%02d' "$day")

这会将“day”变量初始化为 1 以指示该月的第一天,然后逐日向前循环,直到该天的名称为星期六。为了使用该-d标志来使用不同于“现在”的时间戳,需要 GNU 日期。循环测试分解如下:

  • [ $(date +%A ...) = "Saturday" ]-- 将日期的输出(询问当前语言环境的完整工作日名称)与“星期六”进行比较
  • date ... -d $(date +%Y-%m-$(printf '%02d' "$day"))-- 为该日期命令指定要显示的日期(不要使用当前时间)-d;该日期是从第二个内部日期命令生成的。该内部日期命令打印当前时间采用 %Y-%m-(day) 格式,其中 %Y 是当前年份,%m 是当前月份,我们传入循环变量“day”。最里面的 printf 语句只是确保日期字段用零填充为两个字符。

最后,它使用计算出的星期六以您所需的格式打印出当前年份和月份。

相关内容