내가 얻는 날짜 형식은 다음과 같습니다.
v_date=$(date +"%Y%m%d" -d "1970-01-01 + $(stat -c '%Z' file ) secs")
v_sysdate=$(date +%Y%m%d)
echo "$v_date"
20150907
echo "$v_sysdate"
20150907
v_date_difference=$((${v_sysdate}-${v_date}))
echo "$v_date_difference"
반환된 값은 -20150907이지만 0이어야 합니다.
하루 동안 날짜 간의 차이를 구하는 방법은 무엇입니까?
답변1
YYYYMMDD 형식으로 작성된 두 날짜는 뺄 수 없습니다. 예를 들어, 20150907 - 20140907
이는 분명히 365 대신 10000을 생성합니다.
20150907 - 20150907
0을 산출합니다. 이는 뺄셈을 계산하는 대신 직접 동등성을 테스트할 수 있다는 점을 제외하면 동등성을 테스트하는 유효한 방법입니다. 이 메시지를 받았다면 -20150907
이는 코드가 귀하가 표시하는 것과 다르며 v_sysdate
추가 문자(공백 및 숫자 제외)가 포함되어 있기 때문입니다.
날짜를 조작하는 합리적인 방법은 날짜를 간단한 숫자 형식으로 변환하는 것입니다.연대). 내부에유닉스 세계, 표준 단위는 초(예: SI)이고 에포크는 1970-01-01입니다.
및 같은 GNU 유틸리티는 이 형식으로 에포크 이후의 날짜를 초 단위로 인쇄 date
합니다 . 예쁘게 인쇄해야 할 때까지 이 형식을 사용하세요. 이 형식으로 날짜를 전달 하려면 날짜 앞에 초를 입력하세요.stat
%s
date
@
v_date=$(stat -c '%Z' file)
v_sysdate=$(date +%s)
v_date_difference=$((v_sysdate-v_date))
date -d "@$v_date" +'File ctime: %Y%M%D'
date -d "@$v_sysdate" +'Current time: %Y%M%D'
echo "$v_date_difference seconds elapsed"
echo "$((v_date_difference / 86400)) days elapsed"
이는 두 시간 사이의 일수를 계산한다는 점에 유의하세요. 예를 들어 어제 23시 59분과 오늘 00시 1분 사이에는 0일의 차이가 나타납니다. 시간을 무시하고 두 날짜의 차이가 필요한 경우 참조 시간을 사용할 수 있습니다.
file_midday_time=$(date +%s -d "$(date '+%Y-%m-%d 12:00' -d "@$(stat -c %Z file)")")
current_midday_time=$(date +%s -d "today 12:00")
day_difference=$(((file_midday_time - current_midday_time + 7200) / 86400))
3601에서 86399 사이의 숫자를 추가하면 일 시계가 일반 시간에서 일광 절약 시간으로 전환되는 경우에도 일이 계산됩니다(하루는 23시간만 지속됨).