在 Linux 中获取给定日期的前一个工作日的函数

Jej*_*ort 3 linux bash date function

给定一个输入日期,我想编写一个 bash 函数来输出前一个工作日。\xc2\xa0\nBy\xc2\xa0this I\xc2\xa0mean 前一个工作日周一到周五);\n我不\'不需要考虑假期。\xc2\xa0\n因此,例如,给定“Jan\xc2\xa02,\xc2\xa02018”,结果应该是“Jan\xc2\xa01,2018”\n(即使这是一个假期),\n但给定“Jan\xc2\xa01,\xc2\xa02018”,结果应该是“Dec\xc2\xa029,\xc2\xa02017”\n(因为 Dec\xc2\xa030 和 \xc2\ xa031 是周六和周日)。\xc2\xa0\n我不需要任何特定的格式;\n只是人类可读且date\xc2\xa0-d.

\n\n

我已尝试以下操作,但似乎没有正确考虑输入日期:

\n\n
function get_previous_busday()\n{\n    DAY_OF_WEEK=`$1 +%w`\n    if [ $DAY_OF_WEEK -eq 0 ] ; then\n        LOOKBACK=-2\n    elif [ $DAY_OF_WEEK -eq 1 ] ; then\n        LOOKBACK=-3\n    else\n        LOOKBACK=-1\n    fi\n    PREVDATE=date -d "$1 $LOOKBACK day"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我今天想应用它:

\n\n
PREVDATE=$(get_previous_busday $(date)) \necho $PREVDATE\n
Run Code Online (Sandbox Code Playgroud)\n\n

昨天:

\n\n
PREVDATE=$(get_previous_busday (date -d "$(date) -1 day")) \necho $PREVDATE\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它不起作用:

\n\n\n\n
function get_previous_busday()\n{\n    DAY_OF_WEEK=`$1 +%w`\n    if [ $DAY_OF_WEEK -eq 0 ] ; then\n        LOOKBACK=-2\n    elif [ $DAY_OF_WEEK -eq 1 ] ; then\n        LOOKBACK=-3\n    else\n        LOOKBACK=-1\n    fi\n    PREVDATE=date -d "$1 $LOOKBACK day"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

G-M*_*ca' 5

做你想做的事情的函数是:

\n\n
get_previous_busday() {\n        if [ "$1" = "" ]\n        then\n                printf \'Usage: get_previous_busday (base_date)\\n\' >&2\n                return 1\n        fi\n        base_date="$1"\n        if ! day_of_week="$(date -d "$base_date" +%u)"\n        then\n                printf \'Apparently "%s" was not a valid date.\\n\' "$base_date" >&2\n                return 2\n        fi\n        case "$day_of_week" in\n          (0|7)         # Sunday should be 7, but apparently some people\n                        # expect it to be 0.\n                offset=-2       # Subtract 2 from Sunday to get Friday.\n                ;;\n          (1)   offset=-3       # Subtract 3 from Monday to get Friday.\n                ;;\n          (*)   offset=-1       # For all other days, just go back one day.\n        esac\n        if ! prev_date="$(date -d "$base_date $offset day")"\n        then\n                printf \'Error calculating $(date -d "%s").\\n\' "$base_date $offset day"\n                return 3\n        fi\n        printf \'%s\\n\' "$prev_date"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,

\n\n
$ get_previous_busday\nUsage: get_previous_date (base_date)\n$ get_previous_busday foo\ndate: invalid date \xe2\x80\x98foo\xe2\x80\x99\nApparently "foo" was not a valid date.\n$ get_previous_busday today\nFri, Nov 30, 2018  1:52:15 AM\n$ get_previous_busday "$(date)"\nFri, Nov 30, 2018  1:52:51 AM\n$ PREVDATE=$(get_previous_busday $(date))\n$ echo "$PREVDATE"\nFri, Nov 30, 2018 12:00:00 AM\n$ get_previous_busday "$PREVDATE"\nThu, Nov 29, 2018 12:00:00 AM\n$ PREVPREVDATE=$(get_previous_busday "$PREVDATE")\n$ printf \'%s\\n\' "$PREVPREVDATE"\nThu, Nov 29, 2018 12:00:00 AM\n$ get_previous_busday "$PREVPREVDATE"\nWed, Nov 28, 2018 12:00:00 AM\n
Run Code Online (Sandbox Code Playgroud)\n