2011-06-10 7 views
5

Voy a establecer una variable de fecha (Say '08 -JUN-2011 ') y quiero hacer algunos cálculos basados ​​en esa fecha,
1. Tengo que obtener el primer día de la día del mes.
2. Fecha anterior del mes de la fecha indicada.
3. Último día del mes de la fecha indicada.Linux Script- Manipulaciones de fecha

Todo lo que sé es manipular usando la fecha y hora actual del sistema, pero no sé cómo implementarlo con la fecha definida por el usuario. Necesito que esto se logre utilizando el script de shell de Linux.

Cualquier ayuda será apreciada.

Gracias,
Karthik

+0

Para # 1, es decir los días de la semana (es decir, de lunes a viernes?), siempre será '01' para el dayNum, ¿verdad? ;-) Buena suerte. – shellter

Respuesta

9

Aquí es cómo realizar las manipulaciones usando fecha GNU:

#!/bin/sh 

USER_DATE=JUN-08-2011 

# first day of the month 
FIRST_DAY_OF_MONTH=$(date -d "$USER_DATE" +%b-01-%Y) 

PREVIOUS_DAY=$(date -d "$USER_DATE -1 days" +%b-%d-%Y) 

# last day of the month 
FIRST_DAY_NEXT_MONTH=$(date -d "$USER_DATE +1 month" +%b-01-%Y) 
LAST_DAY_OF_MONTH=$(date -d "$FIRST_DAY_NEXT_MONTH -1 day" +%b-%d-%Y) 

echo "User date: $USER_DATE" 
echo "1. First day of the month: $FIRST_DAY_OF_MONTH" 
echo "2. Previous day: $PREVIOUS_DAY" 
echo "3. Last day of the month: $LAST_DAY_OF_MONTH" 

La salida es:

User date: JUN-08-2011 
1. First day of the month: Jun-01-2011 
2. Previous day: Jun-07-2011 
3. Last day of the month: Jun-30-2011 
+0

Oh, muchas gracias, esto realmente funcionó. La respuesta de todos es buena y la respuesta de Gregg realmente encaja mejor para mí. ¡Gracias! – Karthik

3

Esto va a ser enrollado en un script de shell. Es mejor utilizar Date :: Manip en Perl, o algo similar en otro lenguaje con todas las funciones. Sin embargo, puedo pensar en algunas formas de hacer esto con el comando de fecha. En primer lugar, se puede utilizar un parámetro --date para establecer un punto de partida para la fecha, así:

 
$ date --date='08-JUN-2011' 
Wed Jun 8 00:00:00 EDT 2011 

, usted puede obtener la fecha anterior como esto:

 
$ date --date='08-JUN-2011 -1 days' 
Tue Jun 7 00:00:00 EDT 2011 

Para el último día del mes, volvería caminando desde el 31 hasta la fecha no falla. Usted puede verificar $? para que

 
$ date --date='31-JUN-2011';echo $? 
date: invalid date `31-JUN-2011' 
1 
$ date --date='30-JUN-2011';echo $? 
Thu Jun 30 00:00:00 EDT 2011 
0 

Para el primer día del mes ... que es por lo general 01 :)

3

Como estás usando Linux, hhopefully que tienen la utilidad GNU fecha disponible. Puede manejar casi cualquier descripción de una fecha relativa que piense.

Éstos son algunos ejemplos

date --date="last month" +%Y-%m-%d 
date --date="yesterday" +%Y-%m-%d 
date --date="last month" +%b 
x=$(date --date "10 days ago" +%Y/%m/%d) 

Para aprender más sobre él ver GNU Date examples

Una vez que lo utilice algunos, Para acceder directamente a su recopilación de información con date --help, que muestra todas las opciones básicas (pero es a veces es difícil de interpretar.)

Espero que esto ayude.

+0

¡Gracias por el enlace de referencia y soporte! – Karthik

0
$ date +%m/01/%Y 

vine aquí en busca de una manera de conseguir el primer día de la actual mes.dround herramienta

0

Uso dateutils':

mes actual:

$ dround today -1 
2014-02-01 

mes anterior

$ dround today -31 
2014-01-31 

El último día del mes en curso:

$ dround today +31 
2014-02-28 

de COU Si puede utilizar una fecha personalizada en lugar de today, la idea es redondear o hasta el día del mes deseado, p. el próximo primero de los meses dado 2010-10-04:

$ dround 2010-10-04 +1d 
2010-11-01 
Cuestiones relacionadas