Dateutils est un ensemble d'outils qui consistent à manipuler les dates et les heures sur la ligne de commande en mettant l'accent sur les cas d'utilisation qui surviennent lors du traitement de grandes quantités de données financières.
Les Dateutils sont hébergés principalement sur github :
page github : https://github.com/hroptatyr/dateutils
page d'accueil du projet : http://www.fresse.org/dateutils/
téléchargements : https://bitbucket.org/hroptatyr/dateutils/downloads
Vous trouverez ci-dessous une courte liste d'exemples illustrant ce que dateutils peut faire. Pour les spécifications complètes, reportez-vous aux pages d'informations et de manuel. Pour les instructions d'installation, reportez-vous au fichier INSTALL.
Les commandes Dateutils sont préfixées par une date
mais ressemblent par ailleurs aux commandes Unix connues pour des raisons d'intuition. La seule exception étant strptime
qui est analogue à la fonction libc du même nom.
strptime
Version en ligne de commande de la fonction C
dateadd
Ajouter des durées aux dates ou heures
dateconv
Convertir des dates ou des heures entre calendriers
datediff
Calcule les durées entre les dates ou les heures
dategrep
Grep les dates ou heures dans les flux d'entrée
dateround
Arrondir les dates ou les heures à des valeurs "plus complètes"
dateseq
Générer des séquences de dates ou d'heures
datesort
Trier par ordre chronologique.
datetest
Comparer les dates ou les heures
datezone
Convertir la date/heure en fuseaux horaires en masse
J'aime tout expliqué par exemple pour avoir une première impression. Alors voilà.
Un outil imitant seq(1) mais dont les entrées proviennent du domaine des dates plutôt que des entiers. Généralement, les scripts utilisent quelque chose comme
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
qui peut maintenant être raccourci en
$ dateseq 2010-01-01 2010-01-10
avec l'avantage supplémentaire que la date de fin peut être donnée directement au lieu d'être calculée à partir de la date de début et d'un intervalle en jours. En outre, il fournit des fonctionnalités spécifiques à la date qui seraient un PITA à implémenter en utilisant l'approche seq(1)/date(1) ci-dessus, comme sauter certains jours de la semaine :
$ 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 fonctionne également sur les heures :
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
et aussi date-heures :
$ 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
Un outil pour convertir des dates entre différents systèmes de calendrier et/ou fuseaux horaires. Alors que d'autres outils de ce type se concentrent généralement sur la conversion des dates grégoriennes, par exemple en calendrier chinois, dconv vise à prendre en charge les systèmes de calendrier essentiels dans les contextes financiers.
Pour convertir une date (grégorienne) en la représentation dite ymcw :
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
et inversement :
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
où la représentation ymcw signifie le %c
-ième %w
du mois d'une année donnée. Ceci est utile si des dates sont spécifiées comme le troisième jeudi de mai par exemple.
dateconv peut également être utilisé pour convertir à la volée des occurrences de dates, d'heures ou de dates-heures dans un flux d'entrée.
$ 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
et surtout pour convertir entre les fuseaux horaires :
$ 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
Un outil pour effectuer une comparaison de dates dans le shell, il est modélisé d'après test(1)
mais avec des options de ligne de commande appropriées.
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
Un outil pour effectuer l'arithmétique des dates (mathématiques des dates) dans le shell. Étant donné une date et une liste de durées, cela calculera de nouvelles dates. Étant donné une durée et une liste de dates, cela calculera de nouvelles dates.
$ 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
Ajout de durées aux heures :
$ dateadd 12:05:00 +10m => 12:15:00
et même date-heure :
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
S'ils sont pris en charge par la base de données zoneinfo du système, des calculs ajustés à la seconde intercalaire sont possibles. Utilisez l'unité rs
pour désigner les secondes « réelles » :
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
par opposition à :
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
Un outil pour calculer la différence entre deux (ou plusieurs) dates. C'est un peu l'inverse de papa. Les sorties seront des durées qui, ajoutées à la première date, donneront la deuxième date.
Obtenez le nombre de jours entre deux dates :
$ datediff 2001-02-08 2001-03-02 => 22
Le format de la durée peut être contrôlé via le commutateur -f
:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
datediff accepte également les horodatages en entrée :
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
Le commutateur -f
fait ce qu'il faut :
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
comparer à :
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
S'ils sont pris en charge par la base de données zoneinfo du système, des calculs ajustés à la seconde intercalaire peuvent être effectués. Utilisez le spécificateur de format %rS
pour obtenir le temps écoulé en secondes « réelles » :
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
Un outil pour extraire les lignes d'un flux d'entrée qui correspondent à certains critères, affichant soit la ligne, soit la correspondance :
$ 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
Un outil pour « arrondir » des dates ou des horodatages à un moment récurrent, comme le mois de janvier suivant/précédent ou le jeudi suivant/précédent.
Arrondir (à l’envers) au premier du mois en cours :
$ dateround '2011-08-22' -1 => 2011-08-01
Recherchez le lundi suivant à partir de la date actuelle (aujourd'hui nous sommes le 08/01/2016) :
$ dateround today Mon => 2015-01-11
Remontez à septembre dernier, puis arrondissez à la fin du mois :
$ dateround today -- -Sep +31d => 2015-09-30
Arrondissez un flux de dates strictement au premier du mois suivant :
$ 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
Arrondissez une série temporelle à la minute suivante (c'est-à-dire que la partie des secondes est 00), puis à l'heure trente suivante (et convertissez-la en 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
Alternativement, si vous divisez la journée en demi-heures, vous pouvez arrondir à l'une de celles-ci en utilisant la notation de co-classe :
$ 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
Ceci est en grande partie identique à l'exemple précédent, sauf qu'une heure complète (étant un multiple pair de demi-heures) est un objectif d'arrondi possible.
Un outil pour classer les lignes d'un fichier par ordre chronologique.
Pour le moment, l'outil datesort
dépend de sort(1)
avec prise en charge des champs, en particulier -t
pour sélectionner un séparateur et -k
pour trier selon un champ particulier.
$ 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"
Un outil pour inspecter rapidement les valeurs de date/heure dans différents fuseaux horaires. Le résultat sera une matrice qui affiche chaque valeur date-heure dans chaque fuseau horaire :
$ 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
L'outil datezone
peut également être utilisé pour obtenir la transition DST suivante ou précédente par rapport à une date/heure donnée :
$ 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
où l'horodatage de gauche indique le décalage de zone actuel et le côté droit est le décalage de zone après la transition. La date/heure indique le moment exact où la transition est sur le point d'avoir lieu.
Essentiellement, datezone
est un meilleur zdump(8)
.
Un outil qui apporte la flexibilité de strptime(3)
à la ligne de commande. Bien que (au moins GNU) date(1)
prenne en charge les formats de sortie, il lui manque tout type de support pour lire des entrées arbitraires à partir du domaine des dates, en particulier lorsque le format d'entrée est spécifiquement connu à l'avance et que seules les dates/heures correspondantes doivent être considéré.
Avec l'outil strptime
lisant des dates étranges comme Mon, May-01/2000
cela devient une question de
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
tout comme vous l'auriez fait en C.
Notez que strptime
utilise en fait la routine strptime de la libc système et, pour la sortie, la routine strftime du système. Les modificateurs d’entrée et de sortie varient donc d’un système à l’autre.
Pour une combinaison analyseur/imprimante portable, utilisez dateconv
comme décrit ci-dessus. Ses spécificateurs de format d’entrée et de sortie sont indépendants du runtime C.
Sans ordre particulier et sans aucune prétention à l'exhaustivité :
dateexpr : http://www.eskimo.com/~scs/src/#dateexpr
Les dateutils d'Allanfalloon : https://github.com/alanfalloon/dateutils
oui http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
Utilisez celui qui correspond le mieux à votre objectif. Et si vous aimez le mien, votez : page openhub de dateutils