web-dev-qa-db-ja.com

今日の日付、シェルスクリプトでX日を引いた日付

今日の日付の年、月、および日からX日を差し引いた3つの変数を作成する必要があります。この質問では、ランダムな日数222を選択します。

だから:

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

私が欲しいのは、この222日前です。

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

編集:222 working daysの代わりに222通常の日が必要です。

31
gcubed

For 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と異なるため、代わりに次を使用します。

_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")
_

そして、それはそれを行う必要があります=)

59
sampson-chen
date '+%Y' --date='222 days ago'
5
chrisaycock

正確な過去の日付は、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"

お役に立てれば !

5
Ashish K
Epoch=$(( `date '+%s'` - ( 24 * 60 * 60 * 222 ) ))
year=`date -d "@$Epoch" '+%Y'`
month=`date -d "@$Epoch" '+%m'`
day=`date -d "@$Epoch" '+%d'`

トリックを行う必要があります。

2
djhaskin987

私は簡単な解決策になると思います

222days_before_TodayYear = $(date -v -222d +%Y)
222days_before_TodayMonth = $(date -v -222d +%m)
222days_before_TodayDay = $(date -v -222d +%d)
0
ThatComputerGuy