나는 명령이 date -d "20170712"
날짜를 확인하고 문자열로 반환한다는 것을 이해합니다 Wed Jul 12 00:00:00 PDT 2017
.
내 질문은 다음과 같습니다
날짜는 내가 제공한 문자열의 형식을 어떻게 알 수 있나요?(이 경우 연도는 2107, 월은 7월, 일은 12입니다)
또한 "20171307"을 전달하고 날짜가 13일이고 월이 7월임을 함수에 알리고 싶다면 어떻게 해야 할까요?
date
명령에 전달되는 문자열의 형식을 지정하는 방법이 있습니까 ?
답변1
GNU는 date
입력 내용을 구문 분석하기 위해 최선을 다하지만 일부 형식은 본질적으로 모호합니다.
BSD는 date
입력 형식을 지정하도록 허용(또는 실제로 요구)한 -f
다음 해당 형식에 따라 입력을 구문 분석하여 입력이 형식과 일치하지 않으면 오류를 발생시킵니다.
그럼에도 불구하고, 귀하와 같은 비논리적이고 임의적인 날짜 형식을 지원하기 위해 표준 도구를 기대하거나 요구하는 것은 잘못된 것 같습니다. 표준 도구는 표준 형식을 지원해야 하며 장기적으로 보면 스크립트와 프로그램이 내부적으로 컴퓨터 친화적인 형식을 사용하는 것이 합리적이라는 것을 알게 될 것입니다. 이상한 행동을 하는 인간과 상호 작용하려면 간단한 쉘 래퍼 함수를 작성하는 것이 쉽습니다.
Wackydate () {
local day # local is a Bashism
local mon
local year
year=${1%????}
mon=${1#$year??}
day=${1#$year}
day=${day%$mon}
shift
date -d "$year$mon$day" "$@"
}
셸의 인수는 각각 시작이나 끝에서 삭제된 와일드카드 문자와 일치하는 값을 대체 ${variable#prefix}
하고 반환합니다 .${variable%suffix}
variable
#
%
답변2
제발, 제발, 이러지 마세요.
일반적으로 날짜 출력은 LC_TIME
변수에 의해 제어 됩니다.
$ LC_TIME=ja_JP.utf8 date; date'
2017年 7月 13日 木曜日 18:00:22 EDT
Thu Jul 13 18:00:22 EDT 2017
날짜 문자열을 구문 분석하는 것은 독자에게 자연스럽고 명백해 보일지라도 매우 어려울 수 있습니다.
위의 일본어 형식과 같습니다.
그것은 할 수 있다아니요date 명령에 대한 입력으로 사용됩니다.
당신은 할 수로케일 파일 편집필요에 맞게 설정하거나 기본값으로 설정할 수도 있습니다.
첫 번째 인용문:
Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. ... It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. ...
——로버트 그루딘, 시간과 삶의 예술.
답변:
대부분 일치하기 때문에ISO-8601날짜 형식.
다음과 같이 인쇄할 수 있습니다.$ date -Id -d 20170713
예, 다음과 같이 어색한 형식을 사용할 수 있습니다(Busybox 날짜 또는 BSD 날짜 사용).
$ busybox date -D '%Y%d%m' -d "20171307" Thu Jul 13 00:00:00 EDT 2017
동일한 형식으로 인쇄해도 됩니다.
$ busybox date -D '%Y%d%m' -d "20171307" +'%Y%d%m' 20171307
2
예, 위의 예는 형식을 제공할 수 있습니다 .
답변3
date
실제로 그것은 사용하는 버전에 따라 다릅니다.
GNU는 date
입력 날짜가 yy[y]*mmdd
( 20170713
2017년 7월 13일) 또는 1000901123
(100090년 11월 23일, 예, 연도가 미래입니다 faaaar ;-))일 것으로 예상합니다. 날짜를 최대 10자리까지 안정적으로 인쇄하지만 나중에 어떻게 될지 잘 모르겠습니다... 연도는 작동 2140000000
하지만 연도는 2150000000
내 시스템에서 작동하지 않습니다.
"휴대 가능하지 않음"과 같은 인간의 표현을 사용할 수도 있습니다 date -d 'yesterday'
.
sed
날짜를 로 재구성하는 데 사용됩니다 yyyymmdd
.