Я хочу иметь возможность рассчитать, является ли ["отметка времени"] старше 90 дней.
Решение
Это может быть достигнуто следующим образом на OSX с использованием встроенной утилиты date
:
#!/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 time и присваиваем результат переменной с именем epoch_timestamp
.
epoch_timestamp=$(date -jf "%Y-%m-%dT%H:%M:%SZ" "${timestamp%%.*}Z" "+%s")
Часть, которая читает "${timestamp%%.*}Z"
, использует Расширение параметра , чтобы удалить подстроку после первого символа точки (.
), включая сам первый символ точки. Это эффективно удаляет подстроку .4658512Z
из вашей временной метки, то есть микросекунд и Z
. Мы делаем это потому, что встроенная в Mac OSX утилита date
не может разрешить микросекунд . Задняя часть Z
существует для восстановления Z
, который был ранее удален.
В шестой строке мы также конвертируем текущую дату / время в время эпохи и присваиваем результат переменной epoch_now
:
epoch_now=$(date "+%s")
В восьмой строке мы вычисляем количество дней разницу между значениями epoch_now
и epoch_timestamp
и присваиваем результат переменной с именем days_diff
:
days_diff=$(( (epoch_now - epoch_timestamp) / (24*3600) ))
Примечание:
Если вы также хотите программно получить значение timestamp
из данных JSON, рассмотрите возможность использования процессора JSON из командной строки, такого как jq или JSON Tool .
Например; используя JSON Tool , вы можете прочитать содержимое файла JSON (как указано в вашем вопросе) и присвоить значение timestamp
переменной timestamp
:
timestamp=$(json -a timestamp <~/Desktop/path/to/file.json)