我正在尝试将以下"时间戳"字符串转换为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_now
和epoch_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
可以比较日期更有用,因为数字比较此格式的作品。