UNIX(HPUX)에서 이전 달의 마지막 날을 얻는 방법

UNIX(HPUX)에서 이전 달의 마지막 날을 얻는 방법

보고를 위해 지난 달의 정보를 수집하는 스크립트를 만들고 있습니다.

지금까지 다음과 같은 변수가 있습니다.

#I used an array to get the previous month. 
set -A months Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov
x=`date +%m`  
y=`expr $x - 1`
year=`date +%Y`
month=`perl -MPOSIX=strftime -le '@t = localtime; $t[3] = 1; $t[4]--;print strftime("%m", @t)'`
month_abv=`echo ${months[$y]}`

가변 출력:

year=2017
month=04
month_abv=Apr

지금 나에게 필요한 건 지난달 말일뿐이다.

답변1

GNU를 사용하여 해당 월의 1일 전날을 계산할 수 있습니다 date.

date -d "$(date +"%Y-%m-01") - 1 day" +"%F"

또는 dateutils다음을 사용하십시오 dateadd.

dateadd "$(date +"%Y-%m-01")" "-1d"

아니면 사용하기가 좀 까다롭습니다 dateutils. 31번째 달의 마지막 날로 반올림됩니다. (기록된 행위는 31일 미만의 달에도 유효합니다.)

$ dateround --next today -31d
2017-04-30
$ dateround --next "2016-03-10" -31d
2016-02-29

답변2

지난 달의 마지막 날을 얻는 방법은 다음과 같습니다.

cal $month $year | awk 'NF {DAYS = $NF}; END {print DAYS}'

변수 자리 표시자를 사용하여 이전 달의 달력을 가져오고 해당 달의 마지막 날을 인쇄할 수 있습니다.

cal 04 2017 | awk 'NF {DAYS = $NF}; END {print DAYS}'

산출:

30

더 쉽고 짧은 방법이 있다면 모든 제안에 열려 있습니다.

답변3

노력하다:

eval "$(
  LC_ALL=C perl -MPOSIX -le '
    @t = localtime;
    $t[3]=0; # set day to 0 (day before the first)
    print strftime q(year=%Y month=%m day=%d month_abv="%b"), @t'
)"

perl일부 쉘 코드(예: year=2017 month=04 day=30 month_abv="Apr") 를 구성한 다음 eval이를 현재 쉘(POSIX 쉘로 가정)에 넣습니다.

LC_ALL=C로케일에 관계없이 Month_abv를 영어로 강제하는 것입니다. 사용자의 로케일에 포함하려면 제거하세요.

day=0트릭은 GNU, FreeBSD, Solaris에서 작동 strftime()하지만 그 외부에서는 얼마나 이식성이 있는지 모르겠습니다.

얻기 위해서는첫 번째지난 달 어느 날, 1월에 실행 중이었음에도 불구하고 이를 교체하는 것이 나 $t[3]=0에게 효과적이었지만 $t[3]=1; $t[4]--다시 한 번 이식성이 얼마나 되는지 잘 모르겠습니다.

답변4

이전 달을 찾으려면 다음 단계를 따르세요.

date -d "-1 months" +%Y/%-m/%-d

이것은 당신에게 줄 것 2018/2/22입니다: 동안 2018/3/22.

date -d "-1 days" +%Y/%-m/%-d

당신에게 줄 것입니다 :2018/3/21

개월이나 일수를 원하는 대로 더하거나 뺄 수 있습니다. 개월 수를 충분히 빼면 전년도로 돌아갑니다.

관련 정보