今天的日期,在shell脚本中减去X天

gcu*_*bed 31 bash sh

我需要创建三个变量,分别为今天的年份,月份和日期,减去X天数.对于这个问题,我会选择一个随机的天数:222.

因此,如果:

TodayYear=`date +%Y`
TodayMonth=`date +%m`
TodayDay=`date +%d`
Run Code Online (Sandbox Code Playgroud)

我想要的是222天前.

222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???
Run Code Online (Sandbox Code Playgroud)

编辑:需要222个工作日而不是222个常规日.

sam*_*hen 61

对于GNU date:

date_222days_before_TodayYear=$(date --date="222 days ago" +"%Y")
date_222days_before_TodayMonth=$(date --date="222 days ago" +"%m")
date_222days_before_TodayDay=$(date --date="222 days ago" +"%d")
Run Code Online (Sandbox Code Playgroud)

对于BSD date::

如果您使用的是OS X或FreeBSD,请使用以下代码,因为BSD日期与GNU日期不同:

date_222days_before_TodayYear=$(date -j -v-222d +"%Y")
date_222days_before_TodayMonth=$(date -j -v-222d +"%m")
date_222days_before_TodayDay=$(date -j -v-222d +"%d")
Run Code Online (Sandbox Code Playgroud)

资料来源:BSD日期手册页

注意:

bash许多其他语言中,您无法使用数字字符启动变量名称,因此我date_为您添加了前缀.


第二次更新:新要求 - 使用222个工作日而不是222个常规日:

(假设:不考虑法定假日,因为这远远超出了我在shell脚本中可以帮助你的范围:)

考虑222个工作日:

  • 每周工作5天,即 floor(222/5) == 44 weeks
  • 44 weeks * 7 days per week == 308 days
  • 额外的剩余天数: 222 % 5 == 2
  • 因此 222 working days == 310 regular days

但是有一个问题!如果常规天数是308或者是预定天数的倍数7,那么我们就可以了,因为从工作日起7天前的任何倍数仍然是工作日.所以我们需要考虑今天是星期一还是星期二:

  • 如果今天是星期一,我们星期六会到星期四
  • 如果今天是星期二,我们星期天到星期天我们想要星期五

所以如果今天是星期一或星期二,你会发现我们还需要2天的额外抵消; 所以,在我们继续之前先让我们先发现:

#!/bin/bash

# Use 310 days as offset instead of 222
offset=310
# Find locale's abbreviated weekday name (e.g., Sun)
today=$(date -j +"%a")
# Check for Mon/Tue
if [[ "$today" == "Mon" ]] || [[ "$today" == "Tue" ]]; then
     offset=$((offset+2))
fi

date_222_working_days_before_TodayYear=$(date -j -v-${offset}d +"%Y")
date_222_working_days_before_TodayMonth=$(date -j -v-${offset}d +"%m")
date_222_working_days_before_TodayDay=$(date -j -v-${offset}d +"%d")
Run Code Online (Sandbox Code Playgroud)

那应该这样做=)


chr*_*ock 5

date '+%Y' --date='222 days ago'
Run Code Online (Sandbox Code Playgroud)


Ash*_*h K 5

您可以在bash中从以下内容获取确切的过去日期

Number=222
current_date=$(date +%Y%m%d)
past_date=$(date -d "$current_date - $Number days" +%Y%m%d)
echo "$current_date\t$past_date"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 !