2011-06-10 109 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