我需要添加/计算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
#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")
评论
谢谢!!您的示例应该在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