유닉스에서 날짜 빼기

유닉스에서 날짜 빼기

특정 날짜에서 한 달 또는 최소 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"

이는 dateGNU Coreutils의 GNU 버전에 따라 다릅니다. 다른 버전의 날짜 @gawk.

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

내 초기 대답은 일반 awk를 사용하는 것을 제안했지만, 내 Debian 시스템에서 추가 테스트를 수행한 결과 이 ​​기능을 사용할 수 없거나 내장 mawk되어 있지 않으므로 GNU Coreutils 또는 GNU Awk를 설치해야 합니다.original-awkstrftime

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

예시용으로 2012년 11월 1일입니다. 이는 사용자가 입력한 날짜일 수 있습니다.

답변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는 내 시간대입니다. 적절한 시간대를 사용할 수 있다고 가정합니다.

관련 정보