webentwicklung-frage-antwort-db.com.de

Heutiges Datum, minus X Tage im Shell-Skript

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.

28
gcubed

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:

  • 5 Arbeitstage pro Woche, das ist floor(222/5) == 44 weeks
  • 44 weeks * 7 days per week == 308 days
  • Zusätzliche Tage übrig: 222 % 5 == 2
  • Deshalb 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:

  • Wenn heute ein Montag ist, würden wir den Samstag dorthin bekommen, wo wir den Donnerstag wollten
  • Wenn heute ein Dienstag ist, würden wir den Sonntag dorthin bekommen, wo wir den Freitag wollten

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 =)

55
sampson-chen

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 !

5
Ashish K
date '+%Y' --date='222 days ago'
3
chrisaycock
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.

2
djhaskin987

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)
0
ThatComputerGuy