2011-06-10 111 views
5

我將設置一個日期變量(Say '08 -JUN-2011'),並且我想根據該日期進行一些計算,即
1.必須獲得給定的第一天一天的月份。
2.給定日期的月份的前一日期。
3.給定日期的最後一天。Linux腳本 - 日期操作

我所知道的只是使用當前系統日期和時間進行操作,但不知道如何使用用戶定義的日期來實現。我需要使用Linux shell腳本來實現這一點。

任何幫助將不勝感激。

感謝,
KARTHIK

+0

對於#1,你的意思是星期幾(即星期一至星期五?),它將始終爲'01' dayNum,對吧? ;-) 祝你好運。 – shellter 2011-06-10 15:26:52

回答

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

哦,非常感謝,這真的很有用。每個人的回答都很好,Gregg的回答對我來說最適合。謝謝! – Karthik 2011-06-11 12:35:43

3

這將在shell腳本將被進行卷積。你最好在perl中使用Date :: Manip,或者在另一個全功能語言中使用類似的東西。但是,我可以想出一些使用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 --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 2011-06-11 12:36:57

0
$ date +%m/01/%Y 

我來到這裏尋找一種方式來獲得當前的第一天月。

0

使用dateutils' dround工具:

本月:

$ 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