日期 - 如何获取下一个工作日(忽略周末)

日期 - 如何获取下一个工作日(忽略周末)

我正在设置一个 cron 作业来在特定时间挂起和唤醒服务器。

我正在使用两个命令。周一至周四运行:

rtcwake -m mem -t $(date +%s -d "08:00")

另一项将于周五运行:

rtcwake -m mem -t $(date +%s -d "monday 08:00")

我想知道是否有可能使这种分离变得不必要。如果date能够理解这样的陈述next weekday 08:00,事情就会简化很多。

我无法找到这是否真的可行或者我应该使用什么语法。

我基本上想避免我的服务器在周六和周日醒来。

答案1

如果您愿意使用ksh93,您可以轻松计算“下一个工作日 0800”,我认为这实际上意味着下周的第一个工作日。假设您位于美国,一周的第一个工作日通常是星期一。

$ printf "%T\n"                
Tue Jan  5 16:04:37 GMT 2021
$ printf "%T\n" "0 8 * * 1"
Mon Jan 11 08:00:00 GMT 2021
$ printf "%(%s)T\n" "0 8 * * 1"
1610352000
$ 

上述工作原理的关键是"0 8 * * 1"代表五个crontab时间和日期字段的字符串。crontab(5)有关这些字段的详细信息,请参阅联机帮助页。

没有多少人知道ksh93时间格式化可以识别这种准 crontab 条目格式的特定部分,并以指定的格式输出相应的日期。

答案2

你可能想尝试

date +%s -d"$(( ( $(date +%w)==5 )?3:1 ))days 8:00"

编辑:回答你的评论: date +%w产生星期几,然后由“条件运算符”(expr?expr:expr)计算:如果 expr1 计算结果为 TRUE,则计算并使用 expr2,否则使用 expr3。所以,星期五是第五天,date +%s -d"3days 8:00其他日子都是跑步date +%s -d"1days 8:00

答案3

这是我针对类似需求提出的想法。比其他答案更详细,但它可能会让它在做什么更加明显。

last_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")

    if [ ${day_of_week} = "0" ] ; then
        look_back=2
    elif [ ${day_of_week} = "1" ] ; then
        look_back=3
    else
        look_back=1
    fi

    date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}

next_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")
    if [ ${day_of_week} = "5" ] ; then
        look_forward=3
    elif [ ${day_of_week} = "6" ] ; then
        look_forward=2
    else
        look_back=1
    fi

    date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}

for i in $(seq 16); do
    now=$(date +'%Y/%m/%d' --date="today + ${i} day")
    prev=$(last_workday "${now}")
    next=$(next_workday "${now}")
    echo "${now}:  ${prev} ${next}"
done

相关内容