Datumsüberprüfung in der Shell

14

Ich möchte das unten stehende Datumsformat im Shell-Skript überprüfen

2015-Jul-13

Ich benutze date -d "2015-Jul-13" +"%Y-%b-%d"aber seinen Fehler als

date: invalid date '2015-Jul-13'
chhaya vishwakarma
quelle
@ Pandya: OP ist über seine / ihre Frage klar. OP möchte das angegebene Datumsformat validieren (prüfen, ob das eingegebene Datum gültig ist oder nicht), aber es besagt, dass das eingegebene Datum ungültig ist.
Thushi
GNU dateerkennt nicht YYYY-MMM-DD. Könnten Sie YYYY-MM-DDoder DD MMM YYYYstattdessen verwenden?
Roaima
Ich bin mir ziemlich sicher atund - glaube ich - touchauch. Ich habe eine Datumsüberprüfungs-Shell-Funktion geschrieben, die auf toucheinmal basiert ... nein, nicht touch- sie verarbeitet nur Ziffern, sondern analysiert sie atziemlich tief ...
mikeserv 13.07.15
@ Thushi lassen Sie uns überflüssigen Kommentar von uns löschen
Pandya
6
Verwechselt den Titel: Datumsüberprüfung ist die Hölle
Adam Davis

Antworten:

12

GNU dateunterstützt nicht YYYY-MMM-DD. Es versteht jedoch DD-MMM-YYYY. Wenn Sie also wirklich mit Datumsangaben dieses Formats umgehen müssen, können Sie so etwas tun, indem Sie einfach die Argumente in ein Format datetauschen , das Folgendes erwartet:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

Hier ist eine All-Shell-Lösung. In den IFS=-Anweisungen wird die Shell angewiesen, eine bevorstehende Befehlszeile durch einen Bindestrich -anstelle von Leerzeichen zu teilen . Die set $ymdparst die $ymdVariable als eine Befehlszeile, aber jetzt durch aufspaltet Bindestrich, Werte für die Parameter zuweisen $1, $2 et seq . Das echo "$3-$2-$1"gibt die drei erfassten Werte einfach in umgekehrter Reihenfolge aus.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
Roaima
quelle
@mikeserv: Coolness! Es funktionierte mit: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") Könnten Sie vielleicht die Magie hinter dem setBefehl enthüllen ?
13.
11

Aus der Manpage: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

Es scheint aber kein YYYY-MMM-DDFormat zu erkennen . Sie können also entweder von unten oder ähnlich wie folgt vorgehen:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

ODER Sie müssen es konvertieren / neu formatieren , bevor Sie es an senden date!

Siehe auch Wie legen Sie ein Format für die bisherige Eingabe fest?


Ich empfehle zu Besuchen: Datumseingabeformate .

Hier sind die Regeln.

Für numerische Monate ist das ISO 8601-Format "Jahr-Monat-Tag" zulässig, wobei Jahr eine beliebige positive Zahl ist, Monat eine Zahl zwischen 01 und 12 ist und Tag eine Zahl zwischen 01 und 31. Eine führende Null muss vorhanden sein wenn eine Zahl kleiner als zehn ist. Wenn das Jahr 68 oder kleiner ist, werden 2000 hinzugefügt. Wenn andernfalls das Jahr kleiner als 100 ist, werden 1900 hinzugefügt. Das in den USA beliebte Konstrukt "Monat / Tag / Jahr" wird akzeptiert. Auch 'Monat / Tag', wobei das Jahr weggelassen wird.

Buchstabierwörtliche Monate können vollständig geschrieben werden: "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", " November oder Dezember. Literale Monate können auf die ersten drei Buchstaben abgekürzt werden, möglicherweise gefolgt von einem abkürzenden Punkt. Es ist auch erlaubt, "Sept" anstelle von "September" zu schreiben.

Wenn Monate wörtlich geschrieben werden , kann das Kalenderdatum wie folgt angegeben werden:

 Tag Monat Jahr
 Tag Monat
 Monat Tag Jahr
 Tag-Monat-Jahr

von mir betont

Hier können Sie sehen, dass es kein Format wie Jahr-Monat-Tag gibt ! (seit Monaten buchstäblich geschrieben)

Pandya
quelle
7

Mit zshkönnten Sie das strftimeeingebaute (über zsh/datetime) mit -r(umgekehrt) verwenden:

strftime -r format timestring

Das Format verwendet , um die Zeitmessung zu analysieren und die Anzahl der Sekunden seit der Epoche auszugeben:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

Dieser Fehler tritt auf, wenn das Datum ungültig ist:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: Format stimmt nicht überein

Sie können die Sekunden seit der Epoche auch in ein anderes Standard- / benutzerdefiniertes Datumsformat konvertieren, z

strftime '%A, %B %d, %Y' 1447970400
Freitag, 20. November 2015
don_crissti
quelle