Bash - конвертировать дату в метку времени - PullRequest
1 голос
/ 26 октября 2019

Я хочу преобразовать дату в метку времени.

Мой ввод выглядит примерно так:

Mon Sep 30 17:37:39 2019 

И я хочу взять эту метку времени и проверить, сколько дней прошло с тех порсегодня.

То, что я пробовал:

data = "$(date --date "$(echo "$info" | grep "Date added: *" | sed 's/Date added\:\s//i' | awk '{$1=$1};1')" '+%H')"
final = $(expr $(date '+%H') - $data)  

Однако в некоторых случаях это будет выводить значения, такие как -9, -3, -12 и т. д., и на текущую дату, которую он в настоящее время распечатывает "08" . Есть какие-нибудь идеи, как решить эту проблему?

Стоит упомянуть, что мне действительно не нужны точные часы, если это усложняет ситуацию, мне интереснее, сколько дней прошло.

РЕДАКТИРОВАТЬ

Текущее решение (не обрабатывает часы, которые являются обломом). Я извлекаю День, Месяц и Год и систематизирую их в YYYY-MM-DD, а затем преобразую в метку времени. Это решение не обрабатывает часы, которые я хочу в конце.

$(( ($(expr $(date '+%s')) - $(date -d "$(printf '%s\n' "$date_added" | awk '{
        printf "%04d-%02d-%02d\n", $5, \
        (index("JanFebMarAprMayJunJulAugSepOctNovDec",$2)+2)/3,$3}')" +"%s")) / 3600 )) 

1 Ответ

2 голосов
/ 26 октября 2019

РЕДАКТИРОВАТЬ: При добавлении универсального решения (после некоторого тестирования и поиска (Google)), пожалуйста, попробуйте выполнить следующие действия, которые предоставят точные дни, часы, минуты и секундымежду двумя датами.

prev=$(date --date='Mon Aug 30 14:46:39 2019' +"%s")
today=$(date +%s)
number_of_seconds=$(( ($today - $prev ) ))
printf '%dd:%dh:%dm:%ds\n' $(($number_of_seconds/86400)) $(($number_of_seconds%86400/3600)) $(($number_of_seconds%3600/60)) $(($number_of_seconds%60))

Вывод выглядит следующим образом (я на моем aws сервере с часовым поясом UTC).

56d:17h:29m:14s
##### Where my system's date is: #####
date
Sat Oct 26 08:16:14 UTC 2019


Не могли бы вы попробовать выполнить один раз.

prev=$(date --date='Mon Sep 30 17:37:39 2019' +"%s")
today=$(date +%s)
echo $(( ($today - $prev )/(60*60*24) ))

Выходные данные Я получаю 25, поскольку я нахожусь в часовом поясе IST, а сейчас около 12:20 IST. Также имена переменных не требуют пояснений, где предыдущая переменная относится к дате, которую ОП попросил получить разницу от сегодняшней даты.

Объяснение получения разницы в днях:

  1. Сначала я передаю заданную дату ОП команде date --date..., чтобы получить ее в время эпохи и сохраняю ее в prev переменную bash.
  2. Теперь создаемtoday Переменная bash, которая имеет текущее время эпохи.
  3. Затем берется разница между этими двумя переменными значениями времени эпохи и преобразуется в точное количество дней путем деления 60*60*24 на его значение эпохи разности.


ПРИМЕЧАНИЕ: Испытано в разные даты для проведения испытаний, например, 30 августа 2019 года:

prev=$(date --date='Mon Aug 30 17:37:39 2019' +"%s")
today=$(date +%s)
echo $(( ($today - $prev )/(60*60*24) ))
56
...