我需要创建三个变量,分别为今天的年份,月份和日期,减去X天数。对于这个问题,我会选择一个随机的天数:222。
所以如果:
TodayYear=`date +%Y`
TodayMonth=`date +%m`
TodayDay=`date +%d`
我想要的是在此之前222天。
222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???
编辑:需要222个工作天,而不是222个常规日。
答案 0 :(得分:56)
对于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")
对于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")
注意:强>
在bash
和许多其他语言中,您无法使用数字字符启动变量名称,因此我为您添加date_
前缀。
第二次更新:新要求 - 使用222个工作日而不是222个常规日:
(假设:不考虑法定假日,因为这远远超出了我在shell脚本中可以帮助您的范围:)
考虑222个工作日:
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")
那应该这样做=)
答案 1 :(得分: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"
希望这有帮助!
答案 2 :(得分:3)
date '+%Y' --date='222 days ago'
答案 3 :(得分:2)
epoch=$(( `date '+%s'` - ( 24 * 60 * 60 * 222 ) ))
year=`date -d "@$epoch" '+%Y'`
month=`date -d "@$epoch" '+%m'`
day=`date -d "@$epoch" '+%d'`
应该做的伎俩。
答案 4 :(得分:0)
我会说更简单的解决方案是
222days_before_TodayYear = $(date -v -222d +%Y)
222days_before_TodayMonth = $(date -v -222d +%m)
222days_before_TodayDay = $(date -v -222d +%d)