我已经安排了一个Bash脚本在该月的第一天运行,但我需要在其中创建2个变量,其中包含上个月的第一个和最后一个日期,无论它们是什么。
是否可以仅使用Bash执行此操作?
答案 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)
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')
但是如果你在另一个日期运行,我猜你需要从一个已知的参考日期开始。