특정 날짜를 얻는 방법

특정 날짜를 얻는 방법

내 스크립트에서는 매월 첫 번째 토요일의 날짜를 가져와야 합니다. 아래 명령에서 지난 토요일 날짜를 얻을 수 있습니다.

date -d 'last Saturday' +%y%m%d

하지만 첫 번째 토요일 약속을 잡지 못했습니다. 시도해 보았음에도 date -d 'First Saturday' +%y%m%d 예상한 결과를 얻지 못했습니다.

예를 들어, 내 요구 사항은 - 이번 달(7월) - 첫 번째 토요일 날짜(200704)입니다.

누구든지 매월 첫 번째 토요일의 날짜를 알 수 있도록 도와줄 수 있나요?

답변1

그리고 ksh93:

$ ksh93 -c 'printf "%(%y%m%d)T\n" "first saturday"'
200704

답변2

세게 때리다

들여쓰기된 명령은 이해를 돕기 위한 것입니다.

$ target_day_id=6 # return value of date +%w; Sunday is 0
$ year_month="$(date +%Y-%m)"
$     echo $year_month
2020-07
$ day_id="$(date --date="${year_month}-01" +%w)"
$     echo $day_id
3
$ # July, 1st 2020 was a Wednesday
$ sat1_date="${year_month}-0$(( ( (7+target_day_id-day_id) % 7 ) + 1 ))"
$     echo $sat1_date
2020-07-04
$     # only formatting from now on
$ sat1_date_short="${sat1_date:2}"
$     echo $sat1_date_short
20-07-04
$ sat1_date_short_digits_only="${sat1_date_short//-/}"
$     echo $sat1_date_short_digits_only 
200704

답변3

GNU 날짜 및 쉘 루프 사용:

day=1
until [ $(date +%A -d $(date +%Y-%m-$(printf '%02d' "$day"))) = "Saturday" ]
do 
  ((day++))
done
date +%y%m$(printf '%02d' "$day")

이는 "day" 변수를 1로 초기화하여 해당 월의 첫 번째 날을 표시한 다음 해당 날짜의 이름이 토요일이 될 때까지 매일 반복됩니다. 이 -d플래그를 사용하여 "현재" 이외의 타임스탬프를 사용하려면 GNU 날짜가 필요합니다. 루프 테스트는 다음과 같이 분류됩니다.

  • [ $(date +%A ...) = "Saturday" ]-- 날짜(현재 로케일의 전체 요일 이름을 묻는) 출력을 "Saturday"와 비교합니다.
  • date ... -d $(date +%Y-%m-$(printf '%02d' "$day"))-- 이 날짜 명령에 대해 표시할 날짜를 지정합니다(현재 시간을 사용하지 않음) -d. 날짜는 두 번째 내부 날짜 명령에서 생성됩니다. 내부 날짜 명령이 인쇄됩니다.현재 시간%Y는 현재 연도이고 %m은 현재 월인 %Y-%m-(일) 형식을 사용하여 루프 변수 "day"를 전달합니다. 가장 안쪽의 printf 문은 단순히 날짜 필드가 0으로 두 문자로 채워졌는지 확인합니다.

마지막으로, 계산된 토요일을 사용하여 현재 연도와 월을 원하는 형식으로 인쇄합니다.

관련 정보