쉘의 날짜 유효성 검증

쉘의 날짜 유효성 검증

쉘 스크립트에서 다음 날짜 형식을 확인하고 싶습니다

2015-Jul-13

사용하고 있는데 date -d "2015-Jul-13" +"%Y-%b-%d"다음과 같이 오류가 발생합니다.

date: invalid date '2015-Jul-13'

답변1

GNU는 이를 date지원하지 않습니다 YYYY-MMM-DD. 따라서 실제로 이 형식으로 날짜를 처리해야 하는 경우 매개변수를 원하는 형식 DD-MMM-YYYY으로 바꾸는 다음과 같은 방법을 사용하여 처리할 수 있습니다 .date

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

이것은 완전한 쉘 솔루션입니다. 이를 분해하면 IFS=-지시문은 쉘에 -공백 대신 하이픈을 사용하여 다가오는 명령줄을 구분하도록 지시합니다. 명령줄처럼 변수를 구문 분석하지만 이제는 하이픈으로 구분하고, set $ymd매개변수에 값을 할당하고,$ymd$1$2 기다리다. 캡쳐된 3개의 값을 역순 echo "$3-$2-$1"으로 출력하면 됩니다.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

답변2

맨페이지에서:-

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

YYYY-MMM-DD그런데 포맷을 인식하지 못하는 것 같습니다 . 따라서 다음과 같은 것을 사용할 수 있습니다.

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

아니면 변환해야 합니다 /재포맷보내기 전에 그냥 보내세요 date!

또한보십시오지금까지 입력 형식을 지정하는 방법은 무엇입니까?


나는 다음을 방문하는 것이 좋습니다:날짜 입력 형식.

이것이 규칙입니다.

숫자 개월의 경우, ISO 8601 형식 "연-월-일"을 사용할 수 있습니다. 여기서 연도는 양수, 월은 01에서 12 사이의 숫자, 일은 01에서 31 사이의 숫자입니다. 숫자가 10보다 작은 경우 앞에 0이 있어야 합니다. 연도가 68 이하이면 2000이 추가되고, 연도가 100보다 작으면 1900이 추가됩니다. 미국에서 널리 사용되는 "월/일/년" 구조가 허용됩니다. 또한 "월/일"은 연도를 생략합니다.

"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" 또는 "November"로 전체 철자를 입력할 수 있습니다. "12월". 문자 그대로의 달은 처음 세 글자로 축약될 수 있으며, 그 뒤에 축약점이 올 수도 있습니다. "9월" 대신 "9월"을 쓸 수도 있습니다.

달을 문자 그대로 쓰면, 달력 날짜는 다음 중 하나로 지정할 수 있습니다.

 일 월 년 일
 월 월 일 년
 일
 월 년

나는 강조했다

여기에서는 유사한 형식이 없음을 알 수 있습니다.년 월 일! (월은 문자 그대로 표기됩니다)

답변3

내장 함수(passable ) 및 (reverse)를 사용할 zsh수 있습니다 .strftimezsh/datetime-r

strftime -r시간 문자열 형식 지정

그것은 사용한다체재분석하다시간 문자열그리고 epoch 이후의 초 수를 출력합니다.

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

날짜가 유효하지 않으면 오류가 나타납니다.

strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5: 형식 불일치

또한 epoch 이후의 초를 다음과 같은 다른 표준/사용자 정의 날짜 형식으로 변환할 수도 있습니다.

strftime '%A, %B %d, %Y' 1447970400
2015년 11월 20일 금요일

관련 정보