Ich muss drei Variablen erstellen, jeweils für Jahr, Monat und Tag für das heutige Datum, abzüglich der X-Anzahl von Tagen. Für diese Frage wähle ich eine zufällige Anzahl von Tagen: 222.
Wenn also:
TodayYear=`date +%Y`
TodayMonth=`date +%m`
TodayDay=`date +%d`
Was ich will, ist 222 Tage davor.
222days_before_TodayYear=???
222days_before_TodayMonth=???
222days_before_TodayDay=???
Edit: Brauchen Sie 222 ArbeitsTage statt 222 normalen Tagen.
Für 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")
Für BSD date
::
Wenn Sie OS X oder FreeBSD verwenden, verwenden Sie stattdessen Folgendes, da das BSD-Datum sich vom Datum GNU unterscheidet:
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")
Quelle: BSD Datum Handbuchseite
Hinweis:
In bash
und vielen anderen Sprachen können Sie einen Variablennamen nicht mit einem numerischen Zeichen beginnen. Daher habe ich ihnen date_
für Sie vorangestellt.
Zweites Update: Neue Anforderung - Verwendung von 222 Arbeitstagen anstelle von 222 regulären Tagen:
(Annahme: Gesetzliche Feiertage nicht berücksichtigen, denn das geht weit über den Rahmen dessen hinaus, was ich Ihnen in einem Shell-Skript helfen kann :)
Betrachten Sie 222 Arbeitstage:
floor(222/5) == 44 weeks
44 weeks * 7 days per week == 308 days
222 % 5 == 2
222 working days == 310 regular days
Aber es gibt einen Haken! Wenn die Anzahl der regulären Tage 308
oder ein Vielfaches von 7
ist, wären wir in Ordnung gewesen, da ein Vielfaches von 7 Tagen vor einem Arbeitstag noch ein Arbeitstag ist. Also müssen wir uns überlegen, ob heute ein Montag oder ein Dienstag ist:
Sie sehen also, dass wir einen zusätzlichen Versatz von 2 Tagen benötigen, wenn heute Montag oder Dienstag ist. lasst uns das erst herausfinden, bevor wir fortfahren:
#!/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")
Und das sollte es tun =)
Sie können das genaue vergangene Datum in bash aus den folgenden Informationen erhalten
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"
Hoffe das hilft !
date '+%Y' --date='222 days ago'
Epoch=$(( `date '+%s'` - ( 24 * 60 * 60 * 222 ) ))
year=`date -d "@$Epoch" '+%Y'`
month=`date -d "@$Epoch" '+%m'`
day=`date -d "@$Epoch" '+%d'`
Sollte den Trick tun.
Ich würde sagen, eine einfachere Lösung wäre
222days_before_TodayYear = $(date -v -222d +%Y)
222days_before_TodayMonth = $(date -v -222d +%m)
222days_before_TodayDay = $(date -v -222d +%d)