在OSX上将字符串转换为bash日期,并检查是否超过90天

时间:2019-03-14 09:19:39

标签: arrays string bash macos date

我正在尝试将以下“时间戳”字符串转换为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

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

3 个答案:

答案 0 :(得分:1)

我认为第一个问题是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的格式字符串将其转换为当前用于其他变量的格式,以读取固定的时间戳。

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

答案 1 :(得分:1)

  

我希望能够计算 [“ 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

说明

以下内容有望帮助您更好地理解上面脚本中的某些组成部分。

  • 在第五行,我们将给定的timestamp2019-02-28T14:49:28.4658512Z转换为Epoch时间,并将结果分配给名为epoch_timestamp的变量。

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

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

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

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

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

注意:

如果您还想通过编程方式从JSON数据中获取timestamp值,请考虑使用命令行JSON处理器,例如jqJSON Tool

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

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

答案 2 :(得分:0)

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

以下对我有用:

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

但是,我的date不支持-v

我不知道如何计算90天,但是我发现%Y%m%d对于比较日期更为有用,因为数字比较适用于这种格式。