"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 -r
POSIX를 사용하여 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
답변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
IFS='/' read d m y <<<09/07/2016 ; echo "$m/$d/$y"
sed -r 's|([^/]*)/([^/]*)|\2/\1|' <<<09/07/2016
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"