Solaris UNIX에 날짜를 뺄 수있는 도구가 있습니까 (GNU 도구를 사용할 수 없음)?) Linux에는 다른 날짜에서 날짜를 뺄 수있는 gawk
이 있습니다. Solaris의 최대 값은 nawk
(개선 된 awk
)로 날짜 계산을 수행 할 수 없습니다. 또한 Perl을 사용할 수 없습니다.
20100909 - 20001010
와 같은 날짜 계산 방법이 있나요?
업데이트 : bc
에서 날짜 계산을 수행 할 수 있습니까?
방금 작성한 awk 스크립트는 POSIX awk와 함께 작동해야합니다. Solaris 버전을 사용해 보셔야합니다. Solaris에는 두 가지 버전의 Awk가 있습니다. 하나는/bin에 있고 다른 하나는/usr/xpg4/bin/awk에 있습니다 (나는 nawk라고 믿습니다).
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`
불행히도 POSIX 명령 줄 유틸리티는 날짜에 대한 산술을 제공하지 않습니다. date -d
및 date +%s
가 있으면 갈 길이지만 GNU 확장입니다.
touch
에 대한 서투른 해킹이 있는데, 날짜가 적어도 n 일 이전인지 확인하는 작업입니다.
touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...
(DST가 간격 내에서 시작되거나 중지되고 스크립트가 오전 1시 이전에 실행되는 경우이 코드는 하나씩 꺼질 수 있습니다.)
몇몇 사람들이 Bourne 또는 POSIX Shell에서 날짜 조작 라이브러리를 구현했습니다. comp.unix.Shell FAQ 에는 몇 가지 예제와 링크가 있습니다.
GNU 도구를 설치하는 것이 고통을 최소화하는 방법 일 수 있습니다.
POSIX의 일부인 date
명령을 사용하여 거의 모든 곳에 있습니다. 업데이트 : 불행히도 -d는 POSIX 날짜의 일부가 아니며 Solaris에는 없을 가능성이 높습니다. 따라서 이것은 OPs 질문에 대답하지 않을 것입니다.
d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`
이제 d1
및 d2
는 Unix Epoch 이후 초에 해당하는 정수입니다. 따라서 둘 사이의 차이를 얻으려면 빼고 ($((d1-d2))
in bash) 원하는 단위로 은폐합니다. 요일이 가장 쉽습니다.
echo "$(((d1-d2)/86400)) days"
Bash가 없으면 변환 방법이 다를 수 있습니다. 가장 이식 가능한 방법은 expr
( expr의 posix man page )를 사용하는 것입니다.
기록을 위해 dateutils 날짜 산술을 다루는 휴대용 도구 세트를 제공하려는 시도입니다. 귀하의 예는
ddiff -i '%Y%m%d' 20001010 20100909
=>
3621
-i
는 입력 형식을 지정합니다.
Perl이 설치 될 가능성이 높으며 CPAN 에서 모듈을 가져 와서 홈 디렉토리에 설치하고 참조 프로그램에서. 이 경우 Date :: Calc 모듈에는 Delta_Days
도움이 될 서브 루틴.
Wrt GNU Solaris의 날짜 :
나는 이것을 다시 말한다 :
너무 많은 Solaris SysAdmin이 새 호스트를 구성 할 때 Solaris 시스템을 "GNU 호환"으로 만드는 Sun (현재 Oracle)의 공식 패키지를 의도적으로 설치하지 않는 데 자부심을 느낍니다. 왜 나를 이긴다.
GNU 날짜는 훌륭하며 기본적으로 모든 Solaris 호스트 IMHO에서 사용할 수 있습니다.
Solaris Companion CD에서 패키지 SFWcoreu를 설치합니다. 설치 후 GNU /opt/sfw/bin/date
표준 설치의 일부라고 생각하므로 이미 가지고있을 수 있습니다. 그러나 날짜의 Sun 버전과 구별하기 위해 gdate
라고합니다.
설치되지 않은 경우 다음을 수행하십시오.
pkg install // solaris/file/gnu-coreutils
Python이있는 경우 :
from time import *
date1 = strptime("20100909","%Y%m%d")
date2 = strptime("20001010","%Y%m%d")
diff = mktime(date1) - mktime(date2)
print repr(d/86400) + " days"
질문에 "gawk"에 태그를 지정했지만 "no GNU tools"라고 말합니다. Gawk에는 날짜 산술이 있습니다.
파이썬 :
from datetime import datetime as dt
a = dt(2010, 9, 9)
b = dt(2000, 10, 10)
print (a - b).days
1. %j
일 (001..366) 형식으로 date1 및 date2 정의
[email protected]:~$ date1=`date -d 20100909 +%j`
[email protected]:~$ date2=`date -d 20001010 +%j`
2. expr
로 차이 계산
[email protected]:~$ datediff=`expr $date2 - $date1`
. 그래서 답은 32 일
[email protected]:~$ echo $datediff days
32 days
[email protected]:~$
... 또는 한 줄짜리 솔루션
[email protected]:~$ echo $(( $(date -d 20001010 +%j) - $(date -d 20100909 +%j) )) days
32 days
[email protected]:~$
또는
[email protected]:~$ expr $(date -d 20001010 +%j) - $(date -d 20100909 +%j)
32
[email protected]:~$
또는
[email protected]:~$ expr `date -d 20001010 +%j` - `date -d 20100909 +%j`
32
[email protected]:~$
Awk Velour 라이브러리 를 사용하여 초 단위의 차이를 반환 할 수 있습니다.
$ velour -n 'print t_utc(2010, 9, 9) - t_utc(2000, 10, 10)'
312854400
또는 날짜 :
$ velour -n 'print t_secday(t_utc(2010, 9, 9) - t_utc(2000, 10, 10))'
3621
MacOS 용 날짜 BSD 사용 :
echo "Quelle est la date de début ?"
read DATE_DE_DEBUT
echo "Quelle est la date de fin ?"
read DATE_DE_FIN
ANNEE=$(($(echo $DATE_DE_FIN | awk -F "/" '{print $3}')-$(echo $DATE_DE_DEBUT | awk -F "/" '{print $3}')))
echo " "
if [[ $ANNEE > 0 ]]; then
for((annee=$ANNEE-1 ; $ANNEE ; annee++))
do
#echo $annee
for((mois=0 ; 13 - $mois ; mois++))
do
# echo année:$annee mois:$mois
for((jour=0 ; 32 - $jour ; jour++))
do
# echo année:$annee mois:$mois jour:$jour
TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
if [[ $TEST = $DATE_DE_FIN ]]; then
echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
echo "est de :";
echo "$annee année(s) $mois mois $jour jour(s)";
exit 0;
fi
done
done
done
else
annee=0
for((mois=0 ; 13 - $mois ; mois++))
do
# echo année:$annee mois:$mois
for((jour=0 ; 32 - $jour ; jour++))
do
#echo année:$annee mois:$mois jour:$jour
TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
if [[ $TEST = $DATE_DE_FIN ]]; then
echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
echo "est de :";
echo "$annee année(s) $mois mois $jour jour(s)";
exit 0;
fi
done
done
fi