날짜를 일/월/년으로 읽도록 강제

날짜를 일/월/년으로 읽도록 강제

"dd/mm/yyyy" 형식의 날짜를 해석하기 위해 GNU 명령을 얻는 방법은 date다음과 같습니다.

내가 얻는 것:

$ date  -d '09/07/2016'
Wed, Sep  7, 2016 12:00:00 AM

내가 원하는 것은:

$ date  -d '09/07/2016'
Sat, Jul  9, 2016 12:00:00 AM

LC_ALL나는 성공하지 않고 그것을 설정하려고 시도했습니다 .

답변1

date -d이것은 GNU 확장이라는 점에 유의하십시오 . 예상되는 구문은 고정되어 있으며 로케일에 독립적입니다. 특히, 그렇습니다아니요사용POSIXgetdate()날짜를 구문 분석합니다(GNU에서 사용하는 인터페이스 date도 호출되었지만).getdate()

일부 busybox 버전의 일부 빌드도 -d옵션을 인식하지만 더 좁은 범위의 형식을 지원합니다. 특히 mm/dd/YYYY.-D <strptime-format>

$ date -D %d/%m/%Y -d 01/10/2016
Sat Oct  1 00:00:00 BST 2016

미국 전화 및 전신 회사(완전 개방) date, 1995년부터 GNU 스타일 -d옵션도 지원합니다. 그 사람은 POSIX 를 사용합니다 getdate(). 따라서 해당 date구현을 사용하면 DATEMSK변수를 사용하여 날짜 구문 분석 방법을 변경할 수 있으며 1996년부터 다음을 사용할 수 있습니다.-p이것strptime명령줄에 -style을 전달하여 형식을 구문 분석합니다.

$ date --version
  version         date (AT&T Research) 2011-01-27
$ date -d 01/10/2016
Sun Jan 10 13:36:39 GMT 2016
$ date -d 01/10/2016 -p %d/%m/%Y
Sat Oct  1 13:36:51 BST 2016

AT&T ksh93도 Compatibility API를 printf %T사용하므로 이 변수의 영향을 받을 수도 있습니다. 따라서 ksh93에서는 다음을 수행할 수 있습니다.getdate()DATEMSK

$ DATEMSK=/dev/stdin <<< %d/%m/%Y printf '%T\n' 01/10/2016
Sat Oct  1 13:47:06 BST 2016

스크립트의 날짜를 이식 가능하게 구문 분석하려면 내장 함수(로드 후)와 옵션을 zsh사용할 수 있습니다 .strftime-r

$ zmodload zsh/datetime
$ strftime -s REPLY -r '%d/%m/%Y' 09/07/2016
$ strftime %c $REPLY
Sat 09 Jul 2016 00:00:00 BST

zsh's는 strftime -rPOSIX를 사용하여 strptime()문자열을 구문 분석합니다. 따라서 로케일에 따라 다릅니다. 예를 들어, 프랑스어 로케일에서는 이를 사용하여 strftime -r %d-%b-%Y 14-juillet-2016프랑스어 날짜를 구문 분석할 수 있습니다.

일부 strptime()구현(예: GNU 구현)에서는 영어가 아닌 로케일에서 여전히 영어 월/일 이름을 허용하지만 전부는 아닙니다(예: Solaris 11의 구현에서는 허용하지 않음). 사용자 로캘에서 영어 날짜를 구문 분석할 때 염두에 두어야 할 몇 가지 사항이 있습니다.

최신 버전 bash에도 ksh 플레이버가 있지만 printf '%(format)T'시간 구문 분석 기능은 없습니다.

완전성을 위해 BSD에서는 다음 과 함께 이것을 사용하여 날짜 형식을 다시 지정할 수 date있습니다 .-f <strptime-format>-j

$ date -jf %d/%m/%Y 01/10/2016
Sat Oct  1 13:47:06 BST 2016

답변2

busybox 날짜를 사용하는 것이 올바른 선택인 것 같습니다.

$ busybox date -uD '%d/%m/%Y' -d '09/07/2016'
Sat Jul  9 00:00:00 UTC 2016

이는 busybox 날짜가 형식( -D)을 사용하여 내부 날짜를 읽을 수 있기 때문에 작동합니다 -d.

명령을 보다 안정적으로 만들고 원하는 형식을 정확하게 작성하려면 다음을 수행하십시오.

$ LC_ALL=C busybox date -uD '%d/%m/%Y' -d '09/07/2016' +'%a, %b %d, %Y %r'
Sat, Jul 09, 2016 12:00:00 AM

Busybox 날짜 명령.

답변3

~에서info date

YEAR-MONTH-DAY숫자 월의 경우 ISO 8601 형식이 허용됩니다.
월을 문자 그대로 쓰는 경우 달력 날짜는 다음 형식 중 하나를 사용할 수 있습니다.

 DAY MONTH YEAR
 DAY MONTH
 MONTH DAY YEAR
 DAY-MONTH-YEAR

그래서 주요 규칙

다음 문자열은 모두 동일한 달력 날짜를 지정합니다.

 1972-09-24     # ISO 8601.
 72-9-24        # Assume 19xx for 69 through 99,
                # 20xx for 00 through 68.
 72-09-24       # Leading zeros are ignored.
 9/24/72        # Common U.S. writing.
 24 September 1972
 24 Sept 72     # September has a special abbreviation.
 24 Sep 72      # Three-letter abbreviations always allowed.
 Sep 24, 1972
 24-sep-72
 24sep72

이 경우 월의 리터럴 이름을 사용하거나 날짜 문자열을 제공하기 전에 날짜 문자열을 재구성할 수 있습니다.date

  1. IFS='/' read d m y <<<09/07/2016 ; echo "$m/$d/$y"
  2. sed -r 's|([^/]*)/([^/]*)|\2/\1|' <<<09/07/2016
  3. tr '/' '\n' <<<09/07/2016 | tac | tr '\n' '-'

답변4

형식 옵션 사용:

date -d `date -d '09/07/2016' +"%d/%m/%Y"` +"%a, %b %-d, %Y 12:00:00 AM"

관련 정보