Bash脚本/命令打印出日期前/后5分钟

Bash脚本/命令打印出日期前/后5分钟,bash,Bash,我需要以某种方式使用bash或其他实用程序中的date命令来打印给定值之前5分钟和之后5分钟的日期和时间。 例如: 输入: Thu Dec 19 14:10 输出: Thu Dec 19 14:05 Thu Dec 19 14:10 Thu Dec 19 14:15 我发现date命令可用于在当前日期/时间执行此操作,是否可与传递的值(即不是当前日期/时间)一起使用?对于当前时间,您可以通过键入来实现此目的 $ date --date='5 minutes ago'; date; date

我需要以某种方式使用bash或其他实用程序中的date命令来打印给定值之前5分钟和之后5分钟的日期和时间。 例如:

输入:

Thu Dec 19 14:10
输出:

Thu Dec 19 14:05 Thu Dec 19 14:10 Thu Dec 19 14:15

我发现
date
命令可用于在当前日期/时间执行此操作,是否可与传递的值(即不是当前日期/时间)一起使用?

对于当前时间,您可以通过键入来实现此目的

$ date --date='5 minutes ago'; date; date --date='5 minutes'
Qui Dez 19 16:09:17 BRST 2013
Qui Dez 19 16:14:17 BRST 2013
Qui Dez 19 16:19:17 BRST 2013
使用特定日期(ex 1978/01/10)


使用GNU
date
,您可以使用
--date
选项的参数执行简单形式的日期/时间算术:

$ date --date 'now + 5 minutes'
使用BSD
date
(至少是Mac OS X附带的版本),
-v
选项允许您执行类似操作,但仅限于当前时间:

$ date -v +5M
$ date -v -5M
否则,您需要在将时间转换为UNIX时间戳(自1970年1月1日起的秒数)后显式执行数学运算:


如果在linux下使用bash,则可以使用
-d
参数对现有日期执行日期操作:

  • 获取相关日期的纪元时间:

    EPOCH=$(date -d 'Thu Dec 19 14:10' '+%s')
    
    这将为您提供自纪元(通常为1970年1月1日)以来的时间(以秒为单位)

  • 现在,您可以使用简单的数学将历元时间减去或增加5分钟(以秒为单位)

    NEW_EPOCH=$(($EPOCH - 300))
    
    显然,5分钟内有300秒

  • 现在将这个新纪元转换回人类可读的日期

    NEW_DATE=$(date -d "1970-01-01 ${NEW_EPOCH} sec")
    

  • 请注意,这仅适用于支持日期-d选项的unix系统(即Linux)

    如果您希望在当前+/-5分钟内执行此操作,并且使用Bash 4.2或更新版本,则可以在不使用外部工具的情况下执行此操作:

    $ printf -v now '%(%s)T'
    $ echo "$now"
    1516161094
    $ f='%a %b %d %R'
    $ printf "%($f)T %($f)T %($f)T\n" "$((now-300))" "$now" "$((now+300))"
    Tue Jan 16 22:46 Tue Jan 16 22:51 Tue Jan 16 22:56
    
    %(datefmt)T
    格式化字符串允许打印日期时间字符串。如果跳过参数(如此处)或参数为
    -1
    ,则使用当前时间

    %s
    以秒为单位格式化自历元以来的时间,
    -v now
    将输出存储在
    now
    中,而不是打印它

    f
    只是一个方便的变量,因此我不必为输出重复格式化字符串三次

    由于使用
    printf
    的参数必须以秒为单位,因此必须使用外部工具将输入字符串(如
    Thu Dec 19 14:10
    )转换为该格式,并替换

    printf -v now '%(%s)T'
    
    例如,任何

    now=$(date '+%s' -d 'Thu Dec 19 14:10')                   # GNU date
    now=$(date -j -f '%a %b %d %T' 'Thu Dec 19 14:10' '+%s')  # macOS date
    

    从海报的时间规范来看,
    isodate=$(日期--rfc-3339=秒-d“Thu-Dec 19 14:10”);日期-d“$isodate+5分钟”
    printf -v now '%(%s)T'
    
    now=$(date '+%s' -d 'Thu Dec 19 14:10')                   # GNU date
    now=$(date -j -f '%a %b %d %T' 'Thu Dec 19 14:10' '+%s')  # macOS date