UNIX에서 날짜 빼기 도구

UNIX에서 날짜 빼기 도구

Solaris UNIX에 날짜를 뺄 수 있는 도구가 있습니까(따라서 GNU 도구를 사용할 수 없음)? Linux에서는 gawk다른 날짜에서 한 날짜를 뺄 수 있다는 것을 알고 있습니다 . 그러나 Solaris에서는 날짜 계산을 수행할 수 없는 최대값은 nawk(improved )입니다. awk펄도 못쓰는데

날짜 계산을 할 수 있는 방법이 있나요 20100909 - 20001010?

업데이트: bc날짜 계산을 수행할 수 있습니까?

답변1

불행하게도 날짜 연산을 제공하는 POSIX 명령줄 유틸리티는 없습니다. 당신이 그것을 가지고 있고 date -d최선 date +%s의 선택이라면 그것은 GNU 확장입니다.

touch날짜가 최소 n일 전인지 확인하는 서투른 해킹이 있습니다 .

touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...

(간격 동안 DST가 시작되거나 중지되고 스크립트가 오전 1시 이전에 실행되면 이 코드는 1이 꺼질 수 있습니다.)

몇몇 사람들은 결국 Bourne 또는 POSIX 쉘에 날짜 조작 라이브러리를 구현하게 되었습니다. 몇 가지 예제와 링크가 있습니다.comp.unix.shell FAQ.

GNU 도구를 설치하는 것은 아마도 노동 집약적이지 않은 방법일 것입니다.

답변2

date거의 모든 곳에서 작동하도록 POSIX의 일부인 명령을 사용하려고 합니다 .업데이트: 불행하게도 -d는 POSIX 날짜의 일부로 나타나지 않으며 Solaris에는 존재하지 않을 수도 있습니다. 따라서 이것은 OP의 질문에 대답하지 못할 수도 있습니다.

d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`

Now d1및 는 d2UNIX 시대 이후의 초 수에 해당하는 정수입니다. 따라서 둘 사이의 차이를 얻으려면 ( $((d1-d2))bash에서) 빼고 원하는 단위로 변환합니다. 인생은 가장 쉽습니다.

echo "$(((d1-d2)/86400)) days"

bash가 없으면 변환 방법이 다를 수 있습니다. 가장 이식성이 뛰어난 방법은 아마도 expr(expr에 대한 posix 매뉴얼 페이지).

답변3

이것은 POSIX awk와 함께 사용해야 하는 방금 작성한 awk 스크립트입니다. Solaris 버전을 사용해 보아야 합니다. Solaris에는 두 가지 버전의 Awk가 있다는 사실을 기억하십시오. 하나는 /bin에 있고 다른 하나는 /usr/xpg4/bin/awk에 있습니다(아무래도 그럴 것 같지 않습니다).

BEGIN {
    daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
    daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
    daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
    daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
    fullday = 86400;
}
/[12][09][0-9][0-9][01][0-9][0123][0-9]/ {
    year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
    date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
    if ((year % 4) == 0 && month > 2) { date = date + 1; }
    print date * fullday - (25200);
}
{}

YYYYmmdd 날짜 문자열을 전달하면 epoch 이후의 초로 변환됩니다(일 경계에 점이 지정됨). 그런 다음 두 개를 뺄 수 있습니다.

today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`

답변4

Perl은 이미 설치되어 있을 가능성이 높으며 다음에서 쉽게 액세스할 수 있습니다.CPAN, 홈 디렉토리에 설치하고그들을 참조귀하의 프로그램에서. 이 경우,날짜::계산모듈에는 Delta_Days도움이 될 수 있는 서브루틴이 있습니다.

관련 정보