【问题标题】:How to subtract two different date formats to get days in bash?如何减去两种不同的日期格式以获得 bash 中的天数?
【发布时间】:2015-09-30 09:02:24
【问题描述】:

我正在研究 bash。我必须从给定日期中减去当前日期才能获得天数作为差异。给定日期的格式为 m/d/yyyy,因此它不是 09/26/2015,而是 9/26/2015。因此,即使我尝试将两个日期都转换为相同的格式并减去它表示无效的日期格式。

           date1=$(date +"%F")
           date2=$(date -d 11/2/2015 +"%F")
           diff=$(date "--date=${date2} -${date1}" +%F)
           echo $diff days remaining

这是我尝试过的一些变化,但不起作用。我究竟做错了什么?提前致谢。

【问题讨论】:

  • 您在尝试date "--date=${date2} -${date1}" +%F 之前检查过date 的手册页吗?或者你做了一个补丁?
  • 我已经检查了手册页。我尝试使用 %s 转换它们并除以 86400 但这也不起作用,因为 m/d/yyyy 将日期读取为 d/m/yyyy

标签: bash shell date unix


【解决方案1】:

试试这个:

let diff=(`date +%s -d 11/2/2015` - `date +%s`)/86400
echo $diff days remaining

【讨论】:

  • 这段代码运行良好。但是我如何将 11/2/2015 转换为 20151102 作为我从文件中读取的给定日期。
【解决方案2】:

有两个问题:将用户提供的日期转换为规范化的形式,并计算天数的差异。

标准化日期

日期如何解释日期字符串取决于当前的语言环境。 尝试找到使用您的特殊格式的语言环境 (%m/%d/%Y):

$ LC_TIME=en_US.UTF-8 date -d 1/2/2015
Fri Jan  2 00:00:00 CET 2015

计算差异

bash 只能进行整数运算,因此首先将您的日期转换为某种整数表示,然后进行减法并将表示转换为天(如果需要)。

$ LC_TIME=en_US.UTF-8 \
  echo $(( ( $(date -d 11/2/2015 +%s) - $(date +%s)) / (3600*24) ))
32

这使用$(...) 而不是... 进行函数替换。 它还使用$(( ... )) 来评估数学表达式而不是bashism let x=(),因此您可以在符合POSIX 的shell 脚本中使用它(例如,由/bin/dash 解释)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2015-07-17
    • 2012-10-13
    • 1970-01-01
    • 2011-11-17
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多