Как получить дату окончания предыдущего месяца на основе даты обработки?
Примеры:
- Дата обработки = 15 января 2015
- Ожидаемая дата = 31 декабря 2014 года,
- Дата обработки = 10 фев2015
- Ожидаемая дата = 31 января 2015
Как получить дату окончания предыдущего месяца на основе даты обработки?
Примеры:
Ответы:
С GNU date
:
$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015
Некоторые оболочки имеют встроенную поддержку манипулирования датами:
С ksh93
:
$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015
С zsh
:
$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015
Есть много способов сделать это; вот самый простой, который я нашел (здесь предполагается, что GNU date
):
$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'
. Вы получаете ошибку, потому что там не было 2011-12-30. То есть смещение дня было сделано по календарному времени. 2011-12-31 минус 31 день дает вам 2011-11-30, потому что 31 снимается с 31. Это не занимает 31 * 24 * 60 * 60 * 60 секунд от текущего времени. Сравните с тем, TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'
что дает вам 29-е, то есть на этот раз, дату, когда это было 24 * 60 * 60 * 60 секунд назад.
Вот версия, которая работает на Mac OS, которая использует date
утилиту BSD :
date -v1d -v-1d +%d%b%Y
Аргументы применяются по порядку. Вы можете себе представить, что дата передается от одного аргумента к другому. Например:
date
) -> 2017-03-06-v1d
) -> 2017-03-01-v-1d)
-> 2017-02-28+%d%b%Y
) -> 28 февраля2017Вы можете использовать любое количество месяцев вперед или назад date -v-1m -v1d -v-1d
, заменяя -1m
количество месяцев назад или вперед ( +1m
) по вашему желанию.
Это общий ответ. Этот вопрос конкретно спрашивает о датах относительно даты начала. Утилита дат Mac OS / BSD не позволяет указывать дату для запуска, но вы можете установить каждый элемент даты отдельно:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y
-> 31 декабря 2014 года
Попробуйте использовать этот код
date -d "-$(date +%d) days month" +%Y-%m-%d