Есть ли способ в 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. Я предполагаю, что вы можете использовать любой подходящий часовой пояс.