如何添加 X 天至今并获取新日期?

如何添加 X 天至今并获取新日期?

我有 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

答案2

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

$ date -d "+10 days"

答案3

在 Mac OS(也许还有其他 BSD 发行版)中:

$ date -v -1d

为了使用 date 命令获得 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

答案4

正如之前的答案,您可以使用-d如下开关:

date -d "$myDate + 10 days"

但您需要注意时区!

可能出错的示例:如果您想要获取一天的时间间隔,例如“2020 年 3 月 8 日”的“一天的开始,一天的结束”,时区为蒙特利尔,夏令时从 2:00 开始:00 am,你可以做

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 "$1" +%z)
    localOffset2=$(date -d "$2" +%z)
    
    # Get the offset in seconds
    localOffsetInSec1=$(echo $localOffset1 | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 * 3600 + \3 * 60)/' | bc)
    localOffsetInSec2=$(echo $localOffset2 | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 * 3600 + \3 * 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/([+-])(.*)/\1 \2/'
}

  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/([+-])(.*)/\1 \2/')")
  endDate=$(date --iso-8601=n -d "$endDate $dateFix seconds")

相关内容