Antworten:
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
+%F %T
als 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/00
der mächtig ist verwirrend.
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.
Versuchen: $(date +%F)
Sie können so etwas tun:
$ date +'%Y-%m-%d'
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)
date -I
habe nicht funktioniert. Die Installation von GNU-Coreutils mit Brew (das das Präfix 'g' verwendet) gdate -I
hat funktioniert.
-I
für GNU dokumentierte Option nicht finden date
, obwohl sie sicher gleichwertig zu sein scheint date +%F
.
date -d '1 hour ago' '+%Y-%m-%d'
Die Ausgabe wäre 2015-06-14
.
%
.
$(date +%F_%H-%M-%S)
kann verwendet werden, um Doppelpunkte (:) dazwischen zu entfernen
Ausgabe
2018-06-20_09-55-58
Mit dem neuesten Bash (Version ≥ 4.2) können Sie das integrierte printf
Format 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
printf
ist viel schneller als date
da es sich um einen eingebauten Bash handelt, während date
es sich um einen externen Befehl handelt.
Auch printf -v date ...
ist schneller als date=$(printf ...)
da es nicht erforderlich ist, eine Unterschale zu gabeln.
date
wenn 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)
printf -v date
Verzweigen einer Unterschale. Sehr gute Infos !!
#!/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.
Ich benutze die folgende Formulierung:
TODAY=`date -I`
echo $TODAY
In der Manpage date
finden Sie eine Reihe weiterer nützlicher Optionen:
man date