Dateutils son un conjunto de herramientas que giran en torno a jugar con fechas y horas en la línea de comandos con un fuerte enfoque en los casos de uso que surgen al tratar con grandes cantidades de datos financieros.
Dateutils están alojados principalmente en github:
página de github: https://github.com/hroptatyr/dateutils
página de inicio del proyecto: http://www.fresse.org/dateutils/
descargas: https://bitbucket.org/hroptatyr/dateutils/downloads
A continuación se muestra una breve lista de ejemplos que demuestran lo que puede hacer dateutils; para obtener especificaciones completas, consulte las páginas de información y manual. Para obtener instrucciones de instalación, consulte el archivo INSTALL.
Los comandos Dateutils tienen el prefijo una date
, pero por lo demás se parecen a los comandos Unix conocidos por razones de intuición. La única excepción es strptime
, que es análoga a la función libc del mismo nombre.
strptime
Versión de línea de comando de la función C
dateadd
Agregar duraciones a fechas u horas
dateconv
Convertir fechas u horas entre calendarios
datediff
Calcular duraciones entre fechas u horas
dategrep
Grep fechas u horas en flujos de entrada
dateround
Redondear fechas u horas a valores "más completos"
dateseq
Genera secuencias de fechas u horas.
datesort
Ordenar cronológicamente.
datetest
Compara fechas u horas
datezone
Convertir fechas/horas a zonas horarias de forma masiva
Me encanta todo lo explicado con ejemplos para tener una primera impresión. Así que aquí viene.
Una herramienta que imita seq(1) pero cuyas entradas provienen del dominio de fechas en lugar de números enteros. Normalmente los scripts utilizan algo como
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
que ahora se puede acortar a
$ dateseq 2010-01-01 2010-01-10
con el beneficio adicional de que la fecha de finalización se puede dar directamente en lugar de computarse a partir de la fecha de inicio y un intervalo en días. Además, proporciona características específicas de fechas que sería un PITA implementar usando el enfoque seq(1)/date(1) anterior, como omitir ciertos días de la semana:
$ 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 también funciona en horarios:
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
y también fechas y horas:
$ 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
Una herramienta para convertir fechas entre diferentes sistemas calendáricos y/o zonas horarias. Mientras que otras herramientas de este tipo suelen centrarse en convertir fechas gregorianas al calendario chino, por ejemplo, dconv tiene como objetivo respaldar sistemas calendáricos que son esenciales en contextos financieros.
Para convertir una fecha (gregoriana) en la llamada representación ymcw:
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
y viceversa:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
donde la representación ymcw significa, el %c
-ésimo %w
del mes en un año determinado. Esto es útil si se especifican fechas como, por ejemplo, el tercer jueves de mayo.
dateconv también se puede utilizar para convertir apariciones de fechas, horas o fechas-horas en un flujo de entrada sobre la marcha
$ 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
y lo más destacado para convertir entre zonas horarias:
$ 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
Una herramienta para realizar comparaciones de fechas en el shell, está modelada a partir de test(1)
pero con opciones de línea de comando adecuadas.
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
Una herramienta para realizar aritmética de fechas (matemáticas de fechas) en el shell. Dada una fecha y una lista de duraciones, esto calculará nuevas fechas. Dada una duración y una lista de fechas, esto calculará nuevas fechas.
$ 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
Agregar duraciones a los tiempos:
$ dateadd 12:05:00 +10m => 12:15:00
e incluso fechas y horas:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
Si es compatible con la base de datos de información de zona del sistema, es posible realizar cálculos ajustados por segundos intercalares. Utilice la unidad rs
para indicar segundos "reales":
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
en contraposición a:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
Una herramienta para calcular la diferencia entre dos (o más) fechas. Esto es un poco lo contrario de papá. Las salidas serán duraciones que, cuando se suman a la primera fecha, dan la segunda fecha.
Obtenga el número de días entre dos fechas:
$ datediff 2001-02-08 2001-03-02 => 22
El formato de duración se puede controlar mediante el modificador -f
:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
dateiff también acepta marcas de tiempo como entrada:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
El modificador -f
hace lo correcto:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
comparar con:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
Si es compatible con la base de datos de información de zona del sistema, se pueden realizar cálculos ajustados por segundos intercalares. Utilice el especificador de formato %rS
para obtener el tiempo transcurrido en segundos "reales":
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
Una herramienta para extraer líneas de un flujo de entrada que coincidan con ciertos criterios, mostrando la línea o la coincidencia:
$ 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
Una herramienta para "redondear" fechas o marcas de tiempo a un momento recurrente en el tiempo, como el enero siguiente/anterior o el jueves siguiente/anterior.
Redondear (hacia atrás) al primero del mes actual:
$ dateround '2011-08-22' -1 => 2011-08-01
Encuentre el próximo lunes a partir de la fecha actual (hoy es 2016-01-08):
$ dateround today Mon => 2015-01-11
Regrese al pasado mes de septiembre y luego redondee al final del mes:
$ dateround today -- -Sep +31d => 2015-09-30
Redondea un flujo de fechas estrictamente a la primera del mes siguiente:
$ 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
Redondea una serie de tiempo al minuto siguiente (es decir, la parte de los segundos es 00) y luego a la siguiente hora y media (y conviértela a 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
Alternativamente, si divides el día en medias horas, puedes redondear a una de ellas usando la notación de coclase:
$ 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
Esto es en gran medida idéntico al ejemplo anterior excepto que una hora completa (que es un múltiplo par de media hora) es un posible objetivo de redondeo.
Una herramienta para poner las líneas de un archivo en orden cronológico.
Por el momento, la herramienta datesort
depende de sort(1)
con soporte para campos, en particular -t
para seleccionar un separador y -k
para ordenar por un campo en particular.
$ 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"
Una herramienta para inspeccionar rápidamente los valores de fecha/hora en diferentes zonas horarias. El resultado será una matriz que muestra cada valor de fecha y hora en cada zona horaria:
$ 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
La herramienta datezone
también se puede utilizar para obtener la transición de horario de verano anterior o siguiente en relación con una fecha/hora determinada:
$ 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
donde la marca de tiempo izquierda indica el desplazamiento de zona actual y el lado derecho es el desplazamiento de zona después de la transición. La fecha/hora indica el momento exacto en el que la transición está a punto de producirse.
En esencia, datezone
es un mejor zdump(8)
.
Una herramienta que aporta la flexibilidad de strptime(3)
a la línea de comando. Si bien (al menos GNU) date(1)
tiene soporte para formatos de salida, carece de cualquier tipo de soporte para leer entradas arbitrarias del dominio de fechas, en particular cuando el formato de entrada se conoce específicamente de antemano y solo se deben usar fechas/horas coincidentes. consideró.
Con la herramienta strptime
, leer fechas extrañas como Mon, May-01/2000
se convierte en una cuestión de
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
tal como lo hubieras hecho en C.
Tenga en cuenta que strptime
en realidad utiliza la rutina strptime de la libc del sistema y, para la salida, la rutina strftime del sistema. Por lo tanto, los modificadores de entrada y salida variarán entre sistemas.
Para una combinación de analizador/impresora portátil, utilice dateconv
como se describe arriba. Sus especificadores de formato de entrada y salida son independientes del tiempo de ejecución de C.
Sin ningún orden en particular y sin pretender que esté completo:
fechaexpr: http://www.eskimo.com/~scs/src/#dateexpr
dateutils de allanfalloon: https://github.com/alanfalloon/dateutils
Sí http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
Utilice el que mejor se adapte a su propósito. Y en caso de que te guste el mío, vota: página openhub de dateutils