JJJJ-MM-TT Formatdatum im Shell-Skript

1112

Ich habe versucht, $(date)in meinem Bash-Shell-Skript zu verwenden, möchte jedoch das Datum im YYYY-MM-DDFormat.
Wie bekomme ich das?

Kapsh
quelle

Antworten:

1831

In bash (> = 4.2) ist es vorzuziehen, den in printf integrierten Datumsformatierer (Teil von bash) anstelle des externen date(normalerweise GNU-Datums) zu verwenden.

So wie:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

In Bash (<4,2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

Andere verfügbare Datumsformate können vom betrachtet werden Datum Manpages (für externen Nicht-bash bestimmten Befehl):

man date
Philip Fourie
quelle
4
In den ersten Tagen des Monats bekomme ich "2012-07-1", was das OP nicht verlangt.
DerMike
6
Das funktioniert bei mir. Die Manpage schlägt vor, dass der erste des Monats 01, Nr. 1 ist (Bsp. 2012-07-01).
Bob Kuhar
31
DATE = $ (Datum +% d-% m-% Y% H:% M:% S); Was ich danach gelandet bin.
JacopKane
5
Ich habe nicht überprüft, wie weit verbreitet diese Verknüpfungen sind, aber in einigen Distributionen können Sie sie +%F %Tals Verknüpfung verwenden +%Y-%m-%d %H:%M:%S. Es genügt zu bemerken , dass einige Dateisysteme (Husten ** HFS) die konvertieren :zu einem /, eine Zeichenkette wie das Geben 2016-09-15 11/05/00der mächtig ist verwirrend.
Beporter
24
Die bevorzugte Syntax in einer POSIX-kompatiblen Shell in diesem Jahrtausend ist date=$(date)anstelle von date=`date`. Verwenden Sie für Ihre privaten Variablen auch keine Großbuchstaben. Variablennamen in Großbuchstaben sind für das System reserviert.
Tripleee
335

Versuchen: $(date +%F)

Kwatford
quelle
12
Die Manpages für Datum lauten:% F vollständiges Datum; Entspricht% Y-% m-% d, ist dies nur eine kompaktere Notation für die akzeptierte Antwort.
Håvard Geithus
92

Sie können so etwas tun:

$ date +'%Y-%m-%d'
Rückgängig machen
quelle
47

Sie suchen nach dem ISO 8601- Standard-Datumsformat. Wenn Sie also ein GNU-Datum (oder einen Datumsbefehl, der moderner als 1988 ist) haben, tun Sie einfach Folgendes:$(date -I)

Mittelalter
quelle
9
Ich habe einen aktuellen (> 1988) Mac OS X-Computer und date -Ihabe nicht funktioniert. Die Installation von GNU-Coreutils mit Brew (das das Präfix 'g' verwendet) gdate -Ihat funktioniert.
Joel Purra
3
Seltsam. Ich kann die -Ifür GNU dokumentierte Option nicht finden date, obwohl sie sicher gleichwertig zu sein scheint date +%F.
Chepner
3
OS X ist im Allgemeinen ein GPL v3-Ödland, daher wurde das Datum oder BASH möglicherweise nicht aktualisiert.
Indolering
20
date -d '1 hour ago' '+%Y-%m-%d'

Die Ausgabe wäre 2015-06-14.

xu2mao
quelle
3
Aus mehreren Gründen falsch, offensichtlich gibt dies das falsche Datum zwischen 00:00 und 01:00 an, und außerdem endet man mit einem %.
Gerhard Burger
es ist nicht wahr. sollte wie dieses spärliche einfache Zitat sein
Beyhan Gül
20
$(date +%F_%H-%M-%S)

kann verwendet werden, um Doppelpunkte (:) dazwischen zu entfernen

Ausgabe

2018-06-20_09-55-58
ahmettolga
quelle
19

Mit dem neuesten Bash (Version ≥ 4.2) können Sie das integrierte printfFormat mit dem Formatmodifikator verwenden %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfist viel schneller als dateda es sich um einen eingebauten Bash handelt, während datees sich um einen externen Befehl handelt.

Auch printf -v date ...ist schneller als date=$(printf ...)da es nicht erforderlich ist, eine Unterschale zu gabeln.

wjandrea
quelle
4
Als Hinweis im Jahr 2019 ist dieser Befehl unglaublich schneller * als datewenn Sie ihn bereits in einem Bash-Skript verwenden, da keine zusätzlichen Bibliotheken geladen werden müssen. (* Ich habe auf meinem Linux-Server einen Geschwindigkeitsunterschied von ~ 160x über 1000 Iterationen gemessen)
timtj
@timtj Danke, dass du darauf hingewiesen hast! Ich habe der Antwort einige Anmerkungen zur Geschwindigkeit hinzugefügt.
Wjandrea
1
Ich wünschte, ich könnte +5 für den Kommentar über das printf -v dateVerzweigen einer Unterschale. Sehr gute Infos !!
Timtj
Normalerweise verwende ich Datum, weil ich auch einige Daten erhöhen muss. Kann printf Datumsarithmetik machen?
Merlin
1
@ Merlin Ich glaube nicht
wjandrea
8

Immer wenn ich eine solche Aufgabe habe, greife ich zurück

$ man strftime

um mich an alle Möglichkeiten zu erinnern.

arp
quelle
7

Wenn Sie das Jahr in einem Zwei-Zahlen-Format wie 17 anstelle von 2017 haben möchten, gehen Sie wie folgt vor:

DATE=`date +%d-%m-%y`
Crt
quelle
6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Hier ist x das verwendete Beispieldatum und das Beispiel zeigt sowohl die Formatierung der Daten als auch das Abrufen von Daten an, die 10 Minuten über dem aktuellen Datum liegen.

Ankitbaldua
quelle
6

Ich benutze die folgende Formulierung:

TODAY=`date -I`
echo $TODAY

In der Manpage datefinden Sie eine Reihe weiterer nützlicher Optionen:

man date
Luís de Sousa
quelle
5

Ich benutze $(date +"%Y-%m-%d") oder $(date +"%Y-%m-%d %T")mit Zeit und Stunden.

Miguel
quelle
1

Sie können das Datum als Umgebungsvariable festlegen und später verwenden

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

oder

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
quelle