如何找到每个月的第二天

如何找到每个月的第二天

如何在 HPUX 中获取当月的第二天(例如 8 月 2 日)。

date -d在 HPUX Unix 中不起作用。

答案1

使用 GNU 和 busybox 实现:

$ date -d '2020-08-02' "+%A"
Sunday

对于 FreeBSD:

$ date -j -f "%d %m %Y" "02 08 2020" "+%A"
Sunday

如果你想获取一年中所有月份的第二天,你可以使用这个 days-in-a-year.sh 脚本:

#!/usr/bin/env sh

year=2021

month=1
while [ $month -le 12 ]; do
    # GNU and busybox
    date -d "$year-$month-02" "+%d %B %Y: %A"

    # FreeBSD
    # date -j -f "%d %m %Y" "02 $month $year" "+%d %B %Y: %A"

    month=$(( month + 1 ))
done

输出:

$ ./days-in-a-year.sh
02 January 2021: Saturday
02 February 2021: Tuesday
02 March 2021: Tuesday
02 April 2021: Friday
02 May 2021: Sunday
02 June 2021: Wednesday
02 July 2021: Friday
02 August 2021: Monday
02 September 2021: Thursday
02 October 2021: Saturday
02 November 2021: Tuesday
02 December 2021: Thursday

顺便说一句,有一个漂亮的实用程序,名为calutil-linux 包的一部分,可以在 FreeBSD 和 Linux 上使用,并且可以在命令行中显示日历:

$ cal
     August 2021
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

答案2

使用我认为应该在 HPUX 上工作的 POSIX 解决方案,您可以从cal

year=2021 month=8    # Omit entirely for current year and month

cal $month $year |
    sed -nE 's/ 2( .*|)$//p' |
    awk '{ split("Sun Mon Tue Wed Thu Fri Sat",h); print h[length($0)/3+1]}'

输出

Mon

解释

cal命令打印日历:

cal

    August 2021
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

我们在行尾查找模式{space} 2 {space}或 a ,然后删除它后面的所有内容。{space} 2然后,我们将结果行的长度除以三(一周的每列有三个字符),并添加1以索引工作日数组。

(本来sed可以合并到 中,awk但我觉得额外的复杂性不值得付出努力。)

从这里开始,可以直接迭代一年中的月份,这似乎是您想要的:

year=2021
for month in January February March April ...
do
    day=$(
        cal "$month" "$year" |
        sed -nE 's/ 2( .*|)$//p' |
        awk '{
            split("Sunday Monday Tuesday Wednesday Thursday Friday Saturday", h);
            print h[length($0)/3+1]
        }'
    )
    printf "%02d %s %d: %s\n" 2 "$month" "$year" "$day"
done

答案3

cu=`date +%d`

 date --date="$(date --date='1 month ago') -$cu days +2days" +%A" "%Y-%m-%d

Friday 2021-07-02



date --date="$(date --date='1 month') -$cu days +2days" +%A" "%Y-%m-%d 
Thursday 2021-09-02

相关内容