如何比较两个时间戳?

如何比较两个时间戳?

我有两个时间戳,一个是这样的24MAR17:00:14:09,另一个是这样的2017-03-25 05:52:09.373941000,我想比较两个时间戳是否相同,我尝试了很多日期函数和 awk 函数,但没有给我结果,请帮助我。

答案1

巴什解决方案:

#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'

d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"

if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then 
    echo "dates are equal"
else 
    echo "dates are unequal"
fi

答案2

尝试这个,

可以将时间2017-03-25 05:52:09.373941000转换为第一种格式24MAR17:00:14:09,然后进行比较。

date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" |  tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"

答案3

主要问题是解析提供的字符串。命令日期仅接受某些格式,而不是全部。解决方案是利用busybox的接受(几乎)日期能力任何格式。

D1

  1. 创建一个格式字符串,以与提供的格式相同的格式打印日期:

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. 使用该字符串告诉 busybox date 如何解析日期字符串。请注意,本地 TZ 可能会更改结果,请使用 -u (UTC) 以避免错误,或者确保为要解析的时间字符串设置正确的 TZ。

    $ d1='24MAR17:00:14:09'
    $ busybox date -u -D '%d%b%y:%T' -d "$d1"
    Fri Mar 24 00:14:09 UTC 2017
    
  3. 使 busybox 日期打印以秒为单位的值(自纪元以来):

    $ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
    1490314449
    

D2

您也可以对第二个时间戳重复该过程,但是在这种情况下,该字符串将直接由日期理解:

$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129

busybox 日期删除了纳秒 ( ${d2%.*})(稍后会详细介绍):

$ busybox date -u -d "${d2%.*}" +'%s'
1490421129

差异

您应该已经在两个变量中捕获了上面的结果:

$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"

然后,计算差异并与零比较:

$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different

或者直接比较字符串(而不是值):

$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different

纳秒

如果您还需要比较纳秒,则会出现三个问题。

  1. 第一个值没有纳秒。首先是第一个日期没有纳秒值。
    您可以附加 9 个零:

    $ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
    $ resd1="$resd1""$(printf '%0*d' 9 0)"
    $ echo "$resd1"echo "$resd2 - $resd1"
    1490314449000000000
    

    或者(更好)重新处理带有日期的值:

    $ resd1="$(date -u -d "@$resd1" +'%s%N')"
    $ echo "$resd1"
    1490314449000000000
    
  2. 第二个日期有纳秒。在这种情况下,第二个日期具有 date 可以直接处理的格式,但如果它具有需要由 busybox date 预处理的格式,我们将需要稍后附加纳秒。举个例子:

    $ d2='2017-03-25 05:52:09.373941000'
    $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}"
    $ echo "$resd2"
    1490421129373941000
    
  3. 并且,您运行的 bash 需要能够处理 64 位整数。
    如果是这样,计算差值:

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    略高于 106,000 秒(约 29 小时):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    

相关内容