如何在Bash脚本中获取上个月的第一个和最后一个日期?

时间:2015-01-13 10:41:37

标签: bash shell

我已经安排了一个Bash脚本在该月的第一天运行,但我需要在其中创建2个变量,其中包含上个月的第一个和最后一个日期,无论它们是什么。

是否可以仅使用Bash执行此操作?

7 个答案:

答案 0 :(得分:11)

您可以尝试使用以下日期命令,无论您执行它们的那一天是为了获得上个月的第一天和最后一天

Firstday=`date -d "-1 month -$(($(date +%d)-1)) days"`
Lastday=`date -d "-$(date +%d) days"`

答案 1 :(得分:6)

由于月份的长短不一,我认为最可靠的方法是将日历偏移量从月份的第一天开始,而不是任何其他任意日期,然后减去天数... < / p>

在下面的代码段中,您可以将$TODAY设置为您需要的任何日期,$LAST_MONTH_START$LAST_MONTH_END最终将包含上个月的开始和结束日期:

TODAY=$(date '+%F') # or whatever YYYY-MM-DD you need
THIS_MONTH_START=$(date -d "$TODAY" '+%Y-%m-01')
LAST_MONTH_START=$(date -d "$THIS_MONTH_START -1 month" '+%F')
LAST_MONTH_END=$(date -d "$LAST_MONTH_START +1 month -1 day" '+%F')

答案 2 :(得分:5)

与某些答案不同,此方法适用于每月的31日和其他任何一天。我用它来输出unix时间戳,但是输出格式很容易调整。

first=$(date --date="$(date +'%Y-%m-01') - 1 month" +%s)
last=$(date --date="$(date +'%Y-%m-01') - 1 second" +%s)

示例(今天的日期是2019年2月14日):

echo $first $last

1546300800 1548979199

要以其他格式输出,请将最终的+%s更改为+%Y-%m-%d之类的其他格式,或者在您的语言环境中省略默认格式。

如果需要,您还可以像这样备份任意月份:

    # variable must be >= 1
    monthsago=23
    date --date="$(date +'%Y-%m-01') - ${monthsago} month"
    date --date="$(date +'%Y-%m-01') - $(( ${monthsago} - 1 )) month - 1 second"

示例输出(今天的日期是2019年2月15日):

2017年3月1日星期三00:00:00 UTC
2017年3月31日星期五23:59:59 UTC

答案 3 :(得分:2)

示例:

#!/bin/bash
for monthsback in 1 2 3 4 5 6 7 8 9 10 11 12
do
    monthsfwd=`expr $monthsback - 1`
    startdate=`date -d "-${monthsback} month -$(($(date +%d)-1)) days" +%Y-%m-%d`
    enddate=`date -d "-$(date +%d) days -${monthsfwd} month" +%Y-%m-%d`
    echo "$monthsback month(s) ago:"
    echo $startdate
    echo $enddate
    echo ""
done

将从(月后)月前输出第一天和最后一天:

2016-06-01 - 2016-06-30

2016-05-01 - 2016-05-31

以下内容将设置上个月开始和结束的两个变量:

#!/bin/bash
monthsback=1
monthsfwd=`expr $monthsback - 1`
startdate=`date -d "-${monthsback} month -$(($(date +%d)-1)) days" +%Y-%m-%d`
enddate=`date -d "-$(date +%d) days -${monthsfwd} month" +%Y-%m-%d`

答案 4 :(得分:1)

TEST

first=`date -d "02/05/2018" +"%Y%m01"`
last=`date -d "02/05/2018 + 1 month-5 day" +"%Y%m%d"`

例如

RUNDATE="20180207"
y="${RUNDATE:0:4}"
m="${RUNDATE:4:2}"
d="${RUNDATE:6:2}"
RUNDATE_START=`date -d "$m/$d/$y" +"%Y%m01"`
  RUNDATE_END=`date -d "$m/$d/$y + 1 month - $d day" +"%Y%m%d"`

结果

20180201<br/>
20180228

答案 5 :(得分:1)

这可以两行完成,调整日期格式以适合。

START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");

#Test Code
echo START_LAST_MONTH=$START_LAST_MONTH
echo END_LAST_MONTH=$END_LAST_MONTH

跑步给:

START_LAST_MONTH=2018-09-01
END_LAST_MONTH=2018-09-30

答案 6 :(得分:0)

如果您在本月的第一天这样做,那么您可以使用类似

的内容
first=$(date --date='-1 month')
last=$(date --date='-1 day')

但是如果你在另一个日期运行,我猜你需要从一个已知的参考日期开始。