我有Linux(RH 5.3)计算机

我需要添加/计算10天加上日期,这样我才能得到新的日期(失效日期))

例如
/>
 # date 
 Sun Sep 11 07:59:16 IST 2012


所以我需要获取

     NEW_expration_DATE = Sun Sep 21 07:59:16 IST 2012


请告知如何计算新的到期日期(使用bash, ksh还是操纵日期命令?)

#1 楼

您可以仅使用-d开关并提供要计算的日期

date
Sun Sep 23 08:19:56 BST 2012
NEW_expration_DATE=$(date -d "+10 days")
echo $NEW_expration_DATE
Wed Oct 3 08:12:33 BST 2012 



  -d, --date=STRING
          display time described by STRING, not ‘now’



这是一个非常强大的工具,您可以执行

date -d "Sun Sep 11 07:59:16 IST 2012+10 days"
Fri Sep 21 03:29:16 BST 2012




TZ=IST date -d "Sun Sep 11 07:59:16 IST 2012+10 days"
Fri Sep 21 07:59:16 IST 2012




prog_end_date=`date '+%C%y%m%d' -d "$end_date+10 days"`


因此,如果$ end_date = 20131001,则$ prog_end_date = 20131011

评论


谢谢!!您的示例应该在GNU日期信息页面中!

–达沃·库伯拉尼克(Davor Cubranic)
17年11月15日在13:30

在OS X上使用内置日期时,您将收到错误消息。使用brew install coreutils安装GNU的日期函数gdate。

–库辛可卡因
18 Jun 20'在10:47



不起作用:$ docker run -it bash bash bash-5.0#date -d“ +10 days”日期:无效日期'+10 days'bash-5.0#

–克里斯蒂安·邦吉诺(Christian Bongiorno)
19年2月13日在2:49

@ChristianBongiorno它确实起作用了,它已经工作了好几年,甚至几十年。问题几乎可以肯定与您的环境有关。

–user591
19年2月13日在7:37

日期;回声$ BASH_VERSION; date -d“ +10 days” GMT 2019年2月13日星期三08:03:43 5.0.0(1)-release GMT 2019年2月23日星期六08:03:43

–user591
19年2月13日在8:04

#2 楼

您可以使用“ + x天”作为格式字符串:

$ date -d "+10 days"


#3 楼

$ date -v -1d


为了使用日期命令获得1天的回溯日期:

$ date -v -1d


它将给出(当前日期-1)表示1天之前。

$ date -v +1d


这将使(当前日期+1)表示1天后。

类似地,下面的书面代码也可以使用的“ d”以找出年,月等。

y-Year
m-Month 
w-Week 
d-Day 
H-Hour 
M-Minute  
S-Second


评论


这适用于我的Mac,但不适用于我们的Gentoo服务器。

– Mike Dotterer
2015年5月6日17:19

比接受的答案好得多,这也允许在一行中使用任意日期格式。

– pferrel
2015年11月9日在16:48

这在Ubuntu 15.10或RedHat 6.6上不起作用。我认为它在RH5.3上也不起作用。原因:“-v”和“ -1d”不是“日期”的有效开关

–syss
16-3-2在9:22

这似乎是日期的Unix / BSD语法,GNU的日期(在许多BSD上为gdate)不支持该日期。 GNU的日期使用已接受答案中的语法。永远记住:GNU不是Unix!

–培根片
16年5月18日在18:08



@BaconBits-但是,如果您是rms,则可以声明,因为许多GNU util代码已移植到Linux,因此“ Linux是GNU”。当然,除了GNU Hurd(FSF的“曾经与未来” OS)仅仅是一个事实。我想惹恼的是,尽管他花了很多时间在思索上,莱纳斯却花了很多时间在写代码上-事实证明,如果您编写代码而不是书本上的代码,您更有可能创建有效的软件。 :-)

–鲍勃·贾维斯(Bob Jarvis)-恢复莫妮卡
16年7月6日在18:41

#4 楼

作为先前的答案,您可以使用-d开关,例如:

date -d "$myDate + 10 days"


,但是您需要注意时区!

一个例子可能出问题的地方:
如果您想获得“ 2020年3月8日”之类的一天的间隔,例如[day of day,day of end],蒙特利尔的时区为DST的2点上午0:00:00,您可以执行

startDate=$(date --iso-8601=n -d "8 march 2020 00:00:00.000000001")
endDate=$(date --iso-8601=n -d "$startDate + 1 day")


,但是代替

startDate → "2020-03-08T00:00:00,000000001-0500"
endDate   → "2020-03-09T00:00:00,000000001-0400"


,您会得到2020年3月9日1小时

startDate → "2020-03-08T00:00:00,000000001-0500"
endDate   → "2020-03-09T01:00:00,000000001-0400"


要解决此问题,您可以执行以下操作:

# Returns the difference between two dates' local time offsets. E.g. : "3600" or "- 1800"
getLocalTimeOffsetDiffInSeconds() {

    # Get the offset in the following format: -0530 for -05h30min
    localOffset1=$(date -d "" +%z)
    localOffset2=$(date -d "" +%z)

    # Get the offset in seconds
    localOffsetInSec1=$(echo $localOffset1 | sed -E 's/^([+-])(..)(..)/scale=2;0( * 3600 +  * 60)/' | bc)
    localOffsetInSec2=$(echo $localOffset2 | sed -E 's/^([+-])(..)(..)/scale=2;0( * 3600 +  * 60)/' | bc)

    # Compute diff
    diffOffsetInSec=$(echo "$localOffsetInSec2 - $localOffsetInSec1" | bc)

    # Add a space between the sign and the value, so it can be used by the command "date".
    echo "$diffOffsetInSec" | sed -E 's/([+-])(.*)/ /'
}

  startDate=$(date --iso-8601=n -d "8 march 2020 00:00:00.000000001")
  endDate=$(date --iso-8601=n -d "$startDate + 1 day")

  # Fixes endDate if the DST changed between the two dates.

  dstDiff=$(getLocalTimeOffsetDiffInSeconds "$startDate" "$endDate")

  # dateFix will be a string to remove the dstDiff from the date in a format
  # that can be understood by the command "date". E.g. "3600 seconds" or "- 3600 seconds".
  dateFix=$(echo "$(echo "- $dstDiff" | bc | sed -E 's/([+-])(.*)/ /')")
  endDate=$(date --iso-8601=n -d "$endDate $dateFix seconds")