我已经安排了一个Bash脚本在该月的第一天运行,但我需要在其中创建2个变量,其中包含上个月的第一个和最后一个日期,无论它们是什么.
是否可以使用Bash来做到这一点?
Log*_*cIO 10
您可以尝试执行以下日期命令,无论您执行它们的那一天是为了获取上个月的第一天和最后一天
Firstday=`date -d "-1 month -$(($(date +%d)-1)) days"`
Lastday=`date -d "-$(date +%d) days"`
Run Code Online (Sandbox Code Playgroud)
rad*_*ech 10
与某些答案不同,此方法适用于该月的31日和其他任何一天。我用它来输出Unix时间戳,但是输出格式很容易调整。
first=$(date --date="$(date +'%Y-%m-01') - 1 month" +%s)
last=$(date --date="$(date +'%Y-%m-01') - 1 second" +%s)
Run Code Online (Sandbox Code Playgroud)
示例(今天的日期是2019年2月14日):
echo $first $last
Run Code Online (Sandbox Code Playgroud)
1546300800 1548979199
要以其他格式输出,请将final更改+%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"
Run Code Online (Sandbox Code Playgroud)
输出示例(今天的日期是2019年2月15日):
UTC 2017年
3 月1日星期三00:00:00 UTC 2017年3月31 日星期五23:59:59
由于月份的长度不同,我认为最可靠的方法是将日历偏移量从月份的第一天开始,而不是任何其他任意日期,然后减去天数......
在下面的代码段中,您可以设置$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')
Run Code Online (Sandbox Code Playgroud)
这可以在两行中完成,调整日期格式以适应。
START_LAST_MONTH=$(date "+%F" -d "$(date +'%Y-%m-01') -1 month")
END_LAST_MONTH=$(date "+%F" -d "$START_LAST_MONTH +1 month -1 day");
#Test Code
echo START_LAST_MONTH=$START_LAST_MONTH
echo END_LAST_MONTH=$END_LAST_MONTH
Run Code Online (Sandbox Code Playgroud)
跑步给出:
START_LAST_MONTH=2018-09-01
END_LAST_MONTH=2018-09-30
Run Code Online (Sandbox Code Playgroud)
小智 0
如果您在该月的第一天执行此操作,那么您可以使用类似的内容
first=$(date --date='-1 month')
last=$(date --date='-1 day')
Run Code Online (Sandbox Code Playgroud)
但如果您要在另一个日期跑步,那么我想您需要从已知的参考日期开始。