Linux Script- Date Manipulations

时间:2011-06-10 12:22:51

标签: linux shell scripting

我将设置一个日期变量(Say '08 -JUN-2011'),我想根据该日期进行一些计算,即, 1.必须到达给定日期的第一天 2.给定日期月份的上一个日期 3.给定日期月份的最后一天。

我所知道的是使用当前系统日期和时间进行操作,但不知道如何使用用户定义的日期来实现。我需要使用Linux shell脚本来实现这一点。

任何帮助将不胜感激。

谢谢,
Karthik

5 个答案:

答案 0 :(得分:10)

以下是使用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

答案 1 :(得分: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:)

答案 2 :(得分:3)

当您使用Linux时,您可以使用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快捷方式收集信息,这显示了所有基本选项(但有时很难解释。)

我希望这会有所帮助。

答案 3 :(得分:0)

$ date +%m/01/%Y

我来这里是为了寻找一种方法来获得当月的第一天。

答案 4 :(得分:0)

使用dateutils'dround工具:

当月:

$ dround today -1
2014-02-01

上个月

$ dround today -31
2014-01-31

本月最后一天:

$ dround today +31
2014-02-28

当然,您可以使用自定义日期而不是today,其目的是向下舍入或向上舍入到所需的日期,例如: 2010-10-04给出的下一个第一个月:

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