如何在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日期获取上个季度的第一天和上个季度的最后一天

Linux 获取上个月的第一秒和上个月的最后一秒

如何在SHELL获取当天时间的月份和上个月的月份还有下个月的月份

js如何获取上个月第一天和最后一天

如何使用 Carbon 获取上个月的第一天和最后一天 - Laravel