2011-06-10 3 views
5

Я установил одну переменную даты (Say '08 -JUN-2011 '), и я хочу сделать некоторые вычисления на основе этой даты, а именно:
1. Придется получить первый день данного дневного месяца.
2. Предыдущая дата месяца указанной даты в.
3. Последний день месяца указанной даты в.Linux Script- Date Manipulations

Все, что я знаю, манипулирует, используя текущую дату и время, но не знаю, как реализовать с определенным пользователем дату. Мне нужно, чтобы это было достигнуто с помощью сценария оболочки Linux.

Любая помощь будет оценена по достоинству.

Спасибо,
Karthik

+0

Для # 1, вы имеете в виду день-неделю (т.е. пн-пт?), она всегда будет «01» для dayNum, правильно? ;-) Удачи. – shellter

ответ

9

Вот как выполнять манипуляции с использованием даты 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" 

Выход есть:

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

О, спасибо большое, это действительно сработало. Ответ каждого хорошо, и ответ Грегга действительно подходит для меня лучше всего. Благодаря! – Karthik

3

Это собирается быть свернуты в сценарии оболочки. Вы лучше использовать Date :: Manip в Perl, или что-то подобное в другом полнофункциональном языке. Однако я могу придумать некоторые способы сделать это с помощью команды date. Прежде всего, вы можете использовать --date параметр, чтобы задать начальную точку для даты, например, так:

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

Вы можете получить предыдущую дату, как это:

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

В последний день месяца, я бы просто идти назад с 31 до даты, не подведет. Вы можете проверить $? для этого

 
$ 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 

В первый день месяца ... что, как правило, 01 :)

3

Как вы используете Linux, hhopefully у вас есть дата утилиты GNU доступны. Он может обрабатывать почти любое описание относительной даты, о которой вы думаете.

Вот некоторые примеры

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) 

Чтобы узнать больше об этом см GNU Date examples

После того, как вы используете его некоторые, вы можете сократить свой сбор информации с date --help, которая показывает все основные параметры (но иногда трудно интерпретировать.)

Я надеюсь, что это помогает.

+0

Спасибо за ссылку и поддержку! – Karthik

0
$ date +%m/01/%Y 

Я пришел сюда в поисках пути, чтобы получить первый день текущего месяц.dround инструмент

0

dateutils'! Используя:

Текущий месяц:

$ dround today -1 
2014-02-01 

Предыдущий месяц

$ dround today -31 
2014-01-31 

В последний день текущего месяца:

$ dround today +31 
2014-02-28 

Из ку rse вы можете использовать пользовательскую дату вместо today, идея состоит в округлении или до желаемого дня месяца, например. следующий первый-оф-месяц отдано 2010-10-04:

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