Вычитание дат в unix

Вычитание дат в unix

Есть ли способ в unix вычесть месяц или хотя бы 30 дней из определенной даты? Дату должен ввести пользователь.

Пример:

2012-11-19 - 1 месяц = ​​2013-10-19

Это не работает:

date -d '2013-10-13 - 1 month' '+%F'

решение1

Самый простой способ — преобразовать дату в значение unix time_t (т. е. секунды с начала эпохи, или «1-1-1970 00:00:00»), а затем вычесть из этого числа 30 дней * 86400 секунд в день.

например, в следующем примере используется set -x, чтобы вы могли видеть значение переменной D по мере его изменения.

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

Обратите внимание, что это зависит от версии GNU dateиз GNU Coreutils. Другие версии date могут не поддерживать преобразование значения time_t обратно в форматированную дату с помощью @. Если вы не установили GNU coreutils, это, вероятно, недоступно в вашей системе AIX, поэтому, gawkвероятно, это ваш лучший вариант для обратного преобразования в форматированную дату:

echo "$D" | gawk '{print strftime("%c", $0)}'

В моем первоначальном ответе предлагался простой awk, но дальнейшее тестирование на моей системе Debian показало, что ни в , mawkни в , original-awkэта strftimeфункция не встроена, поэтому вам придется установить либо GNU Coreutils, либо GNU Awk.

Если в системе установлен perl, то вместо awk можно использовать perl:

echo $D | perl -nE 'say scalar gmtime $_'

Существует несколько альтернативных методов и примеров того, как это сделать:

https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

решение2

Попробуй это:

date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01

Для иллюстрации использовано 1 ноября 2012 г. Это может быть любая дата, введенная пользователем.

решение3

В вашем примере используются относительные элементы в строках дат, которые являются расширением дат GNU.

Например, в Fedora 19 ваш пример работает так, как и ожидалось:

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

Таким образом, вы можете быть уверены, что ваш скрипт использует дату GNU.

решение4

Попробуй это.

DAY30=`TZ=EST+720 date "+%Y-%m-%d"`

print $DAY30

720 — это смещение в часах. Таким образом, 30 дней — это 720 часов.

Мой часовой пояс — EST. Я предполагаю, что вы можете использовать любой подходящий часовой пояс.

Связанный контент