40

3 つの変数を作成する必要があります。それぞれ、Year、Month、Day の今日の日付から 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_


2 回目の更新:新しい要件 -通常の 222 日ではなく 222 営業日を使用:

(仮定:法定休日は考慮していません。これは、私がシェル スクリプトでお手伝いできる範囲をはるかに超えているためです:)

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 に答える
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 に答える