Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数获取Linux中给定日期的前一个工作日_Linux_Bash_Function_Date - Fatal编程技术网

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

函数获取Linux中给定日期的前一个工作日,linux,bash,function,date,Linux,Bash,Function,Date,给定一个输入日期,我想编写一个bash函数,输出前一个工作日的数据 我指的是前一个工作日(周一到周五); 我不需要把假期考虑在内 例如,假设“2018年1月2日”,结果应该是“2018年1月1日” (即使是假日), 但考虑到“2018年1月1日”,结果应该是“2017年12月29日” (因为12月30日和31日是周六和周日) 我不需要任何特定的格式; 只是一些人类可读且可被日期-d接受的东西 我尝试了以下方法,但似乎没有正确考虑输入日期: function get_previous_busday

给定一个输入日期,我想编写一个bash函数,输出前一个工作日的数据 我指的是前一个工作日(周一到周五); 我不需要把假期考虑在内 例如,假设“2018年1月2日”,结果应该是“2018年1月1日” (即使是假日), 但考虑到“2018年1月1日”,结果应该是“2017年12月29日” (因为12月30日和31日是周六和周日) 我不需要任何特定的格式; 只是一些人类可读且可被日期-d接受的东西

我尝试了以下方法,但似乎没有正确考虑输入日期:

function get_previous_busday()
{
    DAY_OF_WEEK=`$1 +%w`
    if [ $DAY_OF_WEEK -eq 0 ] ; then
        LOOKBACK=-2
    elif [ $DAY_OF_WEEK -eq 1 ] ; then
        LOOKBACK=-3
    else
        LOOKBACK=-1
    fi
    PREVDATE=date -d "$1 $LOOKBACK day"
}
我想在今天申请:

PREVDATE=$(get_previous_busday $(date)) 
echo $PREVDATE
昨天:

PREVDATE=$(get_previous_busday (date -d "$(date) -1 day")) 
echo $PREVDATE
但它不起作用:

main.sh:未找到第3行:Fri:命令
main.sh:第4行:[:-eq:应为一元运算符
main.sh:第6行:[:-eq:应为一元运算符
main.sh:第11行:-d:未找到命令
main.sh:命令替换:第20行:意外标记“日期”附近出现语法错误
main.sh:命令替换:第20行:`get_previous_busday(date-d“$(date)-1天”)'

执行所需操作的函数是:

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

$ get_previous_busday
Usage: get_previous_date (base_date)
$ get_previous_busday foo
date: invalid date ‘foo’
Apparently "foo" was not a valid date.
$ get_previous_busday today
Fri, Nov 30, 2018  1:52:15 AM
$ get_previous_busday "$(date)"
Fri, Nov 30, 2018  1:52:51 AM
$ PREVDATE=$(get_previous_busday $(date))
$ echo "$PREVDATE"
Fri, Nov 30, 2018 12:00:00 AM
$ get_previous_busday "$PREVDATE"
Thu, Nov 29, 2018 12:00:00 AM
$ PREVPREVDATE=$(get_previous_busday "$PREVDATE")
$ printf '%s\n' "$PREVPREVDATE"
Thu, Nov 29, 2018 12:00:00 AM
$ get_previous_busday "$PREVPREVDATE"
Wed, Nov 28, 2018 12:00:00 AM

有几种方法可以获得恢复工作日所需的补偿

  • 您可以编写案例陈述:

    case $dow in
        0|7)    backday=2;;   # For Sunday (either named 0 or 7) go back 2 days
        1)      backday=3;;   # For monday go back three (3) days.
        *)      backday=1;;   # For the rest, just one day.
    esac
    
  • 你可以使用数学:

    backday=$(( ((dow%7)>1) ? 1 : (dow%7)+2 ))
    
  • 或查找数组:

    a=(0 1 2 3 4 5 6 7)
    b=(2 3 1 1 1 1 1 2)
    backday=${b[dow]}
    
  • 对于任何替代方案,您都可以使用此(无错误检测)功能,
    以及一些测试:

    #!/bin/bash
    get_previous_busday() {  dow=$(date -d "$*" '+%w')
                             backday=$(( ((dow%7)>1) ? 1 : (dow%7)+2 ))
                             prev_date="$(date -d "$* -$backday day")"
                             printf '%s\n' "$prev_date"
                          }
    
    get_previous_busday "$(date)"
    get_previous_busday $(date -d "-1 day")
    get_previous_busday $(date -d "-2 day")
    get_previous_busday $(date -d "-3 day")
    get_previous_busday $(date -d "-4 day")
    
    将打印:

    Fri Nov 30 10:03:45 UTC 2018
    Fri Nov 30 10:03:45 UTC 2018
    Fri Nov 30 10:03:45 UTC 2018
    Thu Nov 29 10:03:45 UTC 2018
    Wed Nov 28 10:03:45 UTC 2018
    

    检查
    $DAY\u OF_WEEK
    (它不是一个整数值),并始终在
    […]
    中使用双引号。此外,请查看
    PREVDATE=$(date-d“$1$LOOKBACK DAY”)
    ,并始终在此处发布之前运行脚本(它将自动查找大多数错误)假期呢?你所说的工作日是指工作日还是周末?