将字符串转换为OSX上的bash日期,并检查是否大于90天



我正在尝试将以下"时间戳"字符串转换为OSX上的bash中的日期。我希望能够计算出大于90天的日期。

<------- hg-test-onprem-connector ------>>>
[
 {
"digest": "sha256:6607adac160984fe08f4578b0894c0640647e28cfb712564621667ee9812938c",
"tags": [],
"timestamp": "2019-02-28T14:49:28.4658512Z"

到目前为止,我已经找到了如何转换bash(OSX)中的日期,但不确定如何将该特定日期转换为该格式。

CURR_DATE=$(date +”%d%m%Y”)
echo ‘Current date: ‘$CURR_DATE
# Find the date 90 days ago – For OSX bash:
DELETION_DATE=$(date -v-90d +”%d%m%Y”)
echo ‘Previous date: ‘$DELETION_DATE

任何建议都会有很大帮助。

我认为第一个问题是OSX date命令不支持小数分数,因此需要修复它,然后才能掩盖日期。

这是我的解决方案:

FIXED_TIMESTAMP=$(echo "2019-02-28T14:49:28.4658512Z" | sed s/\.[0-9]*//g)
TIMESTAMP_AS_DATE=$(date -jf "%Y-%m-%dT%H:%M:%SZ" $FIXED_TIMESTAMP +%d%m%Y)
echo ‘Timestamp date: ‘$TIMESTAMP_AS_DATE

上面代码的第一行使用SED剥离第二个组件的小数分数。然后,在第二行中,我们使用ISO8601兼容格式字符串将其转换为您当前用于其他变量的格式,以在固定的时间戳中读取。

应该返回与您拥有的其他数字值一致的数值。

我希望能够计算 [" TIMESTAMP"] 日期大于90天。

解决方案

可以使用内置date实用程序在OSX上实现这一点:

#!/usr/bin/env bash
timestamp=2019-02-28T14:49:28.4658512Z
epoch_timestamp=$(date -jf "%Y-%m-%dT%H:%M:%SZ" "${timestamp%%.*}Z" "+%s")
epoch_now=$(date "+%s")
days_diff=$(( (epoch_now - epoch_timestamp) / (24*3600) ))
# Testing...
if (( days_diff > 90 )); then
  echo "${timestamp} is greater than 90 days old."
else
  echo "${timestamp} is less than, or equal to 90 days old."
fi

解释

有望有助于更好地理解上述脚本中的某些组成部分。

  • 在第五行上,我们将给定的timestamp值(即2019-02-28T14:49:28.4658512Z)转换为时期时间,并将结果分配给名为epoch_timestamp的变量。

    epoch_timestamp=$(date -jf "%Y-%m-%dT%H:%M:%SZ" "${timestamp%%.*}Z" "+%s")
    

    读取"${timestamp%%.*}Z"的部分利用参数扩展来删除第一个点字符(.)之后的子字符串,包括第一个点字符本身。这可以有效地从您的时间戳中删除.4658512Z子字符串,即 microseconds Z。我们这样做是因为MAC OSX内置date实用程序无法解析 microseconds 。尾随Z部分存在以恢复以前已删除的Z

  • 在第六行上,我们还将当前日期/时间转换为时期时间,并将结果分配给名为epoch_now的变量:

    epoch_now=$(date "+%s")
    
  • 在第8行上,我们计算 epoch_nowepoch_timestamp值之间的差异 值,并将结果分配给名为 days_diff的变量:

    days_diff=$(( (epoch_now - epoch_timestamp) / (24*3600) ))
    

注意:

如果您也想从JSON数据中编程地获取timestamp值,请考虑使用命令行JSON处理器(例如JQ或JSON工具)。

例如;使用 json工具您可以读取JSON文件的内容(如您的问题中给出),然后将timestamp值分配给名为timestamp的变量:

timestamp=$(json -a timestamp <~/Desktop/path/to/file.json)

OSX日期是否支持-d--date)?

以下对我有效:

    date -d "2019-02-28T14:49:28.4658512Z" +"%d%m%Y"

但是,我的date不支持-v

我不知道如何计算90天,但是我发现%Y%m%d可以比较日期更有用,因为数字比较此格式的作品。

最新更新