Bei Dateutils handelt es sich um eine Reihe von Tools, bei denen es um die Manipulation von Datums- und Uhrzeitangaben in der Befehlszeile geht, wobei der Schwerpunkt stark auf Anwendungsfällen liegt, die beim Umgang mit großen Mengen an Finanzdaten auftreten.
Dateutils werden hauptsächlich auf Github gehostet:
Github-Seite: https://github.com/hroptatyr/dateutils
Projekthomepage: http://www.fresse.org/dateutils/
Downloads: https://bitbucket.org/hroptatyr/dateutils/downloads
Nachfolgend finden Sie eine kurze Liste von Beispielen, die zeigen, was dateutils leisten kann. Die vollständigen Spezifikationen finden Sie in den Info- und Manpages. Installationsanweisungen finden Sie in der INSTALL-Datei.
Dateutils-Befehlen wird ein date
vorangestellt, ansonsten ähneln sie aus Gründen der Intuition jedoch bekannten Unix-Befehlen. Die einzige Ausnahme ist strptime
, das analog zur gleichnamigen libc-Funktion ist.
strptime
Befehlszeilenversion der C-Funktion
dateadd
Dauer zu Datum oder Uhrzeit hinzufügen
dateconv
Datums- oder Zeitangaben zwischen Kalendern konvertieren
datediff
Berechnet die Dauer zwischen Datums- und Uhrzeitangaben
dategrep
Grep-Daten oder -Zeiten in Eingabestreams
dateround
Rundet Datums- und Uhrzeitangaben auf „vollständigere“ Werte
dateseq
Erzeugt Sequenzen von Datums- oder Uhrzeitangaben
datesort
Chronologisch sortieren.
datetest
Vergleichen Sie Daten oder Zeiten
datezone
Konvertieren Sie Datum/Uhrzeit in großen Mengen in Zeitzonen
Ich liebe alles, was anhand von Beispielen erklärt wird, um einen ersten Eindruck zu bekommen. Also hier kommt es.
Ein Tool, das seq(1) nachahmt, dessen Eingaben jedoch aus der Domäne von Datumsangaben und nicht von Ganzzahlen stammen. Typischerweise verwenden Skripte so etwas wie
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
was nun abgekürzt werden kann
$ dateseq 2010-01-01 2010-01-10
mit dem zusätzlichen Vorteil, dass das Enddatum direkt angegeben werden kann, anstatt aus dem Startdatum und einem Intervall in Tagen berechnet zu werden. Außerdem bietet es datumsspezifische Funktionen, deren Implementierung mit dem oben genannten seq(1)/date(1)-Ansatz eine PITA wäre, wie zum Beispiel das Überspringen bestimmter Wochentage:
$ dateseq 2010-01-01 2010-01-10 --skip sat,sun => 2010-01-01 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08
Dateseq funktioniert auch mit Zeiten:
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
und auch Datum/Uhrzeit:
$ dateseq --compute-from-last 2012-01-02T12:00:00 5m 2012-01-02T12:17:00 => 2012-01-02T12:02:00 2012-01-02T12:07:00 2012-01-02T12:12:00 2012-01-02T12:17:00
Ein Tool zum Konvertieren von Daten zwischen verschiedenen Kalendersystemen und/oder Zeitzonen. Während sich andere Tools dieser Art normalerweise auf die Konvertierung gregorianischer Daten in beispielsweise den chinesischen Kalender konzentrieren, zielt dconv auf die Unterstützung von Kalendersystemen ab, die im Finanzkontext von wesentlicher Bedeutung sind.
Um ein (gregorianisches) Datum in die sogenannte ymcw-Darstellung umzuwandeln:
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
und umgekehrt:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
wobei die ymcw-Darstellung den %c
-ten %w
des Monats in einem bestimmten Jahr bedeutet. Dies ist nützlich, wenn Daten angegeben werden, beispielsweise der dritte Donnerstag im Mai.
dateconv kann auch verwendet werden, um Vorkommen von Datums-, Uhrzeit- oder Datums-Uhrzeit-Werten in einem Eingabestream im laufenden Betrieb zu konvertieren
$ dateconv -S -i '%b/%d %Y at %I:%M %P' <<EOF Remember we meet on Mar/03 2012 at 02:30 pm EOF => Remember we meet on 2012-03-03T14:30:00
und vor allem zum Umrechnen zwischen Zeitzonen:
$ dateconv --from-zone "America/Chicago" --zone "Asia/Tokyo" 2012-01-04T09:33:00 => 2012-01-05T00:33:00 $ dateconv --zone "America/Chicago" now -f "%d %b %Y %T" => 05 Apr 2012 11:11:57
Ein Tool zum Durchführen von Datumsvergleichen in der Shell. Es ist test(1)
nachempfunden, verfügt jedoch über die richtigen Befehlszeilenoptionen.
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
Ein Tool zur Durchführung von Datumsarithmetik (Datumsmathematik) in der Shell. Anhand eines Datums und einer Liste von Dauern werden neue Daten berechnet. Bei gegebener Dauer und einer Liste von Daten werden neue Daten berechnet.
$ dateadd 2010-02-02 +4d => 2010-02-06 $ dateadd 2010-02-02 +1w => 2010-02-09 $ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF => 2001-01-04 2000-12-31
Dauer zu Zeiten hinzufügen:
$ dateadd 12:05:00 +10m => 12:15:00
und sogar Datum/Uhrzeit:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
Sofern die Zoneinfo-Datenbank des Systems dies unterstützt, sind schaltsekundenbereinigte Berechnungen möglich. Verwenden Sie die Einheit rs
um „echte“ Sekunden anzugeben:
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
im Gegensatz zu:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
Ein Tool zur Berechnung der Differenz zwischen zwei (oder mehr) Datumsangaben. Dies ist in gewisser Weise das Gegenteil von Papa. Bei den Ausgaben handelt es sich um Dauern, die, wenn sie zum ersten Datum addiert werden, das zweite Datum ergeben.
Ermitteln Sie die Anzahl der Tage zwischen zwei Daten:
$ datediff 2001-02-08 2001-03-02 => 22
Das Dauerformat kann über den Schalter -f
gesteuert werden:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
datediff akzeptiert auch Zeitstempel als Eingabe:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
Der Schalter -f
macht das Richtige:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
vergleiche mit:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
Wenn die Zoneinfo-Datenbank des Systems dies unterstützt, können schaltsekundenbereinigte Berechnungen durchgeführt werden. Verwenden Sie den Formatbezeichner %rS
, um die verstrichene Zeit in „echten“ Sekunden zu erhalten:
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
Ein Tool zum Extrahieren von Zeilen aus einem Eingabestream, die bestimmten Kriterien entsprechen und entweder die Zeile oder die Übereinstimmung anzeigt:
$ dategrep '<2012-03-01' <<EOF Feb 2012-02-28 Feb 2012-02-29 leap day Mar 2012-03-01 Mar 2012-03-02 EOF => Feb 2012-02-28 Feb 2012-02-29 leap day
Ein Tool zum „Runden“ von Datums- oder Zeitstempeln auf einen wiederkehrenden Zeitpunkt, beispielsweise den nächsten/vorherigen Januar oder den nächsten/vorherigen Donnerstag.
Runden (rückwärts) auf den Ersten des aktuellen Monats:
$ dateround '2011-08-22' -1 => 2011-08-01
Finden Sie den nächsten Montag ab dem aktuellen Datum (heute ist der 08.01.2016):
$ dateround today Mon => 2015-01-11
Gehen Sie zurück zum letzten September und runden Sie dann zum Monatsende:
$ dateround today -- -Sep +31d => 2015-09-30
Runden Sie eine Reihe von Terminen streng auf den ersten des nächsten Monats ab:
$ dateround -S -n 1 <<EOF pay cable 2012-02-28 pay gas 2012-02-29 pay rent 2012-03-01 redeem loan 2012-03-02 EOF => pay cable 2012-03-01 pay gas 2012-03-01 pay rent 2012-04-01 redeem loan 2012-04-01
Runden Sie eine Zeitreihe auf die nächste Minute (d. h. der Sekundenteil ist 00) und dann auf die nächste Halbzeit (und konvertieren Sie sie in ISO):
$ dateround -S 0s30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:30:00 eventB
Alternativ können Sie, wenn Sie den Tag in halbe Stunden unterteilen, mithilfe der Co-Klassen-Notation auf eine davon runden:
$ dateround -S /30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:00:00 eventB
Dies ist weitgehend identisch mit dem vorherigen Beispiel, mit der Ausnahme, dass eine volle Stunde (ein gerades Vielfaches von halben Stunden) ein mögliches Rundungsziel ist.
Ein Tool, um die Zeilen einer Datei in chronologische Reihenfolge zu bringen.
Im Moment hängt das datesort
Tool von sort(1)
mit Unterstützung für Felder ab, insbesondere -t
um ein Trennzeichen auszuwählen, und -k
um nach einem bestimmten Feld zu sortieren.
$ datesort <<EOF 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" EOF => 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53"
Ein Tool zur schnellen Überprüfung von Datums-/Uhrzeitwerten in verschiedenen Zeitzonen. Das Ergebnis ist eine Matrix, die jeden Datum-Uhrzeit-Wert in jeder Zeitzone anzeigt:
$ datezone Europe/Berlin Australia/Sydney now 2014-06-30T05:00:00 => 2014-01-30T17:37:13+01:00 Europe/Berlin 2014-01-31T03:37:13+11:00 Australia/Sydney 2014-06-30T07:00:00+02:00 Europe/Berlin 2014-06-30T15:00:00+10:00 Australia/Sydney
Das datezone
Tool kann auch verwendet werden, um den nächsten oder vorherigen DST-Übergang relativ zu einem bestimmten Datum/einer bestimmten Uhrzeit zu ermitteln:
$ datezone --next Europe/Berlin Australia/Sydney 2013-02-19 => 2013-03-31T02:00:00+01:00 -> 2013-03-31T03:00:00+02:00 Europe/Berlin 2013-04-07T03:00:00+11:00 -> 2013-04-07T02:00:00+10:00 Australia/Sydney
Dabei bezeichnet der linke Zeitstempel den aktuellen Zonenversatz und die rechte Seite den Zonenversatz nach dem Übergang. Das Datum/die Uhrzeit gibt den genauen Zeitpunkt an, zu dem der Übergang stattfinden wird.
Im Wesentlichen ist datezone
ein besseres zdump(8)
.
Ein Tool, das die Flexibilität von strptime(3)
auf die Befehlszeile bringt. Während (zumindest GNU) date(1)
Ausgabeformate unterstützt, fehlt jegliche Unterstützung zum Lesen beliebiger Eingaben aus dem Datumsbereich, insbesondere wenn das Eingabeformat vorher genau bekannt ist und nur übereinstimmende Daten/Uhrzeiten vorhanden sein sollen berücksichtigt.
Mit dem strptime
Tool wird das Lesen seltsamer Daten wie Mon, May-01/2000
zum Kinderspiel
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
genau wie Sie es in C getan hätten.
Beachten Sie, dass strptime
tatsächlich die strptime-Routine der System-Libc und für die Ausgabe die strftime-Routine des Systems verwendet. Eingabe- und Ausgabemodifikatoren variieren daher zwischen den Systemen.
Für eine tragbare Parser/Drucker-Kombination verwenden Sie dateconv
wie oben beschrieben. Seine Eingabe- und Ausgabeformatspezifizierer sind unabhängig von der C-Laufzeit.
In keiner bestimmten Reihenfolge und ohne Anspruch auf Vollständigkeit:
Datumsausdruck: http://www.eskimo.com/~scs/src/#datumsausdruck
allanfalloons Dateutils: https://github.com/alanfalloon/dateutils
jast http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
Verwenden Sie diejenige, die am besten zu Ihrem Zweck passt. Und falls Ihnen meine gefällt, stimmen Sie ab: dateutils' Openhub-Seite