함수의 날짜 형식을 지정하는 방법

함수의 날짜 형식을 지정하는 방법

나는 명령이 date -d "20170712"날짜를 확인하고 문자열로 반환한다는 것을 이해합니다 Wed Jul 12 00:00:00 PDT 2017.

내 질문은 다음과 같습니다

  1. 날짜는 내가 제공한 문자열의 형식을 어떻게 알 수 있나요?(이 경우 연도는 2107, 월은 7월, 일은 12입니다)

  2. 또한 "20171307"을 전달하고 날짜가 13일이고 월이 7월임을 함수에 알리고 싶다면 어떻게 해야 할까요?

  3. 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.
 ...

——로버트 그루딘, 시간과 삶의 예술.

답변:

  1. 대부분 일치하기 때문에ISO-8601날짜 형식.
    다음과 같이 인쇄할 수 있습니다.

    $ date -Id -d 20170713 
    
  2. 예, 다음과 같이 어색한 형식을 사용할 수 있습니다(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
    
  3. 2예, 위의 예는 형식을 제공할 수 있습니다 .

답변3

date실제로 그것은 사용하는 버전에 따라 다릅니다.

GNU는 date입력 날짜가 yy[y]*mmdd( 201707132017년 7월 13일) 또는 1000901123(100090년 11월 23일, 예, 연도가 미래입니다 faaaar ;-))일 것으로 예상합니다. 날짜를 최대 10자리까지 안정적으로 인쇄하지만 나중에 어떻게 될지 잘 모르겠습니다... 연도는 작동 2140000000하지만 연도는 2150000000내 시스템에서 작동하지 않습니다.

"휴대 가능하지 않음"과 같은 인간의 표현을 사용할 수도 있습니다 date -d 'yesterday'.

sed날짜를 로 재구성하는 데 사용됩니다 yyyymmdd.

관련 정보