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

因此,如果:

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

我想要的是在此之前的222天。
222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???

编辑:需要222 工作天,而不是222常规天。

最佳答案

对于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 date manual page

注意:

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

  • 但是有一个问题!如果常规天数是3087的若干倍,那么我们会没事的,因为从一个工作日开始的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")
    

    那应该做到=)

    关于bash - 今天的日期,在Shell脚本中减去X天,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13533661/

    10-11 00:31