유닉스에서 날짜 빼기

유닉스에서 날짜 빼기

특정 날짜에서 한 달 또는 최소 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 -xD 변수의 값이 변경되는 것을 볼 수 있도록 사용합니다.

#! /bin/ksh

set -x

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

date -d "@$D"

이는 dateGNU Coreutils의 GNU 버전에 따라 다릅니다. 다른 버전의 날짜는 time_t 값을 @. GNU coreutils를 설치하지 않은 경우 AIX 시스템에서 이 기능을 사용할 수 없으므로 gawk형식이 지정된 날짜로 다시 변환하는 가장 좋은 옵션일 수 있습니다.

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

내 원래 답변은 일반 awk를 제안했지만 데비안 시스템에 대한 추가 테스트 결과 기능이 내장되어 있지도 않았으므로 GNU mawkCoreutils 또는 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는 내 시간대입니다. 적절한 시간대를 사용할 수 있다고 가정합니다.

관련 정보