如何在Bash脚本中获取上个月的第一个和最后一个日期?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Bash脚本中获取上个月的第一个和最后一个日期?相关的知识,希望对你有一定的参考价值。
我已经安排了一个Bash脚本在该月的第一天运行,但我需要在其中创建2个变量,其中包含上个月的第一个和最后一个日期,无论它们是什么。
是否可以使用Bash来做到这一点?
您可以尝试执行以下日期命令,无论您执行它们的那一天是为了获取上个月的第一天和最后一天
Firstday=`date -d "-1 month -$(($(date +%d)-1)) days"`
Lastday=`date -d "-$(date +%d) days"`
由于月份的长度不同,我认为最可靠的方法是将日历偏移量从月份的第一天开始,而不是任何其他任意日期,然后减去天数......
在下面的代码段中,您可以将$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')
与某些答案不同,这将适用于本月的第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
例:
#!/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`
这可以用两行来完成,调整日期格式以适应。
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
TEST
first=`date -d "02/05/2018" +"%Y%m01"`
last=`date -d "02/05/2018 + 1 month-5 day" +"%Y%m%d"`
example
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"`
result
20180201<br/>
20180228
如果你在这个月的第一天这样做,那么你可以使用类似的东西
first=$(date --date='-1 month')
last=$(date --date='-1 day')
但如果你在另一个日期运行,那么我想你需要从一个已知的参考日期开始。
以上是关于如何在Bash脚本中获取上个月的第一个和最后一个日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何在n个月内使用sql(无程序)获取每个月的第一天和最后一天
Oracle SQL日期获取上个季度的第一天和上个季度的最后一天