쉘에서 날짜 유효성 검사


14

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

2015-Jul-13

사용하고 date -d "2015-Jul-13" +"%Y-%b-%d"있지만 오류가 발생했습니다.

date: invalid date '2015-Jul-13'

@Pandya : OP는 자신의 질문에 대해 분명합니다. OP는 언급 된 날짜 형식을 확인하려고하지만 입력 한 날짜가 유효하지 않다고 말합니다.
Thushi

GNU date는 인식하지 못합니다 YYYY-MMM-DD. YYYY-MM-DD또는 DD MMM YYYY대신 사용할 수 있습니까?
roaima

나는 확실히 at, 그리고 나는 생각 touch한다. 나는 touch한 번 기반으로 날짜 유효성 검사 쉘 funvtion을 썼다 ... 아니, 아니 touch-그것은 단지 숫자를 처리하지만 at약간의 깊은 파싱을 수행합니다 ...
mikeserv

@Thushi 우리에 의해 중복 의견을 정리하자
Pandya

6
오해 제목 : 날짜 유효성 검사는 지옥입니다
Adam Davis

답변:


12

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 등 서열 . 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

@ mikeserv : 차가움! 그것은 함께 일했다 : ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") 당신은 아마도 set명령 뒤에 마법을 밝힐 수 있습니까?
joepd

11

맨 페이지에서 :-

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 형식 'year-month-day'가 허용됩니다. 여기서 year는 임의의 숫자이고 month는 01과 12 사이의 숫자이며 day는 01과 31 사이의 숫자입니다. 앞에 0이 있어야합니다. 숫자가 10보다 작은 경우 연도가 68 이하이면 2000이 추가됩니다. 그렇지 않으면 연도가 100보다 작 으면 1900이 추가됩니다. 미국에서 인기있는 '월 / 일 / 년'구성이 허용됩니다. 연도를 생략하고 '월 / 일'도 있습니다.

문자 월 은 '1 월', '2 월', '3 월', '4 월', '5 월', '6 월', '7 월', '8 월', '9 월', '10 월 ',' 11 월 또는 12 월 리터럴 달은 처음 세 글자로 축약 될 수 있으며 그 뒤에는 약점이 표시 될 수 있습니다. '9 월'대신 '9 월'을 쓰는 것도 허용됩니다.

월이 문자 그대로 쓰여 지면 달력 날짜는 다음 중 하나로 주어질 수 있습니다.

 일 월 년
 일 월
 달 일 년
 일-월-년

나에 의해 강조

여기서 년-월-일과 같은 형식이 없음을 알 수 있습니다 ! (수개월 동안 문자 그대로 작성 됨)


7

으로 zsh당신은 사용할 수 있습니다 strftime(를 통해 사용할 수 내장 zsh/datetime과 함께)을 -r(역) :

strftime -r 형식 시간 문자열

형식 을 사용 하여 시간 문자열 을 구문 분석하고 신기원 이후의 시간 (초)을 출력합니다.

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

날짜가 유효하지 않으면 오류가 발생합니다.

strftime -r %Y-%b-%d 2015-Jul-33
zsh : strftime : 5 : 형식이 일치하지 않습니다

에포크 이후 초를 다른 표준 / 사용자 정의 날짜 형식으로 변환 할 수도 있습니다.

strftime '%A, %B %d, %Y' 1447970400
2015 년 11 월 20 일 금요일
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.