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
및 는 d2
UNIX 시대 이후의 초 수에 해당하는 정수입니다. 따라서 둘 사이의 차이를 얻으려면 ( $((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`