Преобразовать строку в дату bash в OSX и проверить, старше 90 дней - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь преобразовать следующую строку "timestamp" в дату в bash на OSX. Я хочу, чтобы можно было рассчитать, если дата старше 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 ]

1 голос
/ 14 марта 2019

Я думаю, что первая проблема в том, что команда 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 голос
/ 14 марта 2019

Я хочу иметь возможность рассчитать, является ли ["отметка времени"] старше 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)
0 голосов
/ 14 марта 2019

Поддерживает ли дата OSX -d (--date)?

У меня работает следующее:

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

Однако мой date не поддерживает -v.

Я не знаю, как рассчитать 90 дней, но нахожу %Y%m%d более полезным для сравнения дат, поскольку числовое сравнение работает для этого формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...