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\nfunction 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我今天想应用它:
\n\nPREVDATE=$(get_previous_busday $(date)) \necho $PREVDATE\nRun Code Online (Sandbox Code Playgroud)\n\n昨天:
\n\nPREVDATE=$(get_previous_busday (date -d "$(date) -1 day")) \necho $PREVDATE\nRun Code Online (Sandbox Code Playgroud)\n\n但它不起作用:
\n\n\n\nfunction 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}\nRun Code Online (Sandbox Code Playgroud)\n
做你想做的事情的函数是:
\n\nget_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}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n