40

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

因此,如果:

TodayYear=`date +%Y`
TodayMonth=`date +%m`
TodayDay=`date +%d`

我想要的是在此之前的 222 天。

222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???

编辑:需要 222 个工作日而不是 222 个正常工作日。

4

5 回答 5

71

对于 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")

来源: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")

那应该这样做=)

于 2012-11-23T17:49:01.200 回答
7
date '+%Y' --date='222 days ago'
于 2012-11-23T17:45:27.630 回答
6

您可以在 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"

希望这可以帮助 !

于 2017-02-06T09:57:22.940 回答
2
epoch=$(( `date '+%s'` - ( 24 * 60 * 60 * 222 ) ))
year=`date -d "@$epoch" '+%Y'`
month=`date -d "@$epoch" '+%m'`
day=`date -d "@$epoch" '+%d'`

应该做的伎俩。

于 2012-11-23T17:49:12.867 回答
0

我会说更简单的解决方案是

222days_before_TodayYear = $(date -v -222d +%Y)
222days_before_TodayMonth = $(date -v -222d +%m)
222days_before_TodayDay = $(date -v -222d +%d)
于 2019-02-07T18:31:02.753 回答