[bash] OS X의`date` 명령에는 ISO 8601`-I` 옵션이 없습니까?

Bash 스크립트에서 현재 날짜 시간을 ISO 8601 형식 (바람직하게는 UTC)으로 인쇄하고 싶습니다. 이것은 다음과 같이 간단해야합니다 date -I.

http://ss64.com/bash/date.html

그러나 이것은 내 Mac에서 작동하지 않는 것 같습니다.

$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

실제로이 man date옵션을 나열하지 않습니다.

왜 이것이 ISO 8601 형식으로 날짜를 인쇄하는지 또는 다른 (쉬운) 방법인지 알고 있습니까? 감사!



답변

당신은 사용할 수 있습니다

date "+%Y-%m-%d"

또는 완전한 ISO-8601 호환 날짜 의 경우 다음 형식 중 하나를 사용하십시오.

date -u +"%Y-%m-%dT%H:%M:%SZ"

산출:

2011-08-27T23:22:37Z

또는

date +%Y-%m-%dT%H:%M:%S%z

산출:

2011-08-27T15:22:37-0800


답변

GNU의 날짜 date -I와 동일 date +%F하고, -Iseconds그리고 -IminutesUTC 오프셋과도 시간을 포함한다.

$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300

-u같다 TZ=UTC. +00:00로 교체 할 수 있습니다 Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

유효한 ISO 8601 날짜 또는 시간 형식이기도합니다.

20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)

이것들은 아닙니다 :

2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)


답변

GNU와 BSD 날짜 모두에서 작동하는 간단한 대안은 다음과 같습니다.

date -u +%FT%T%z


답변

coreutils 패키지는 GNU 버전의 도구를 제공합니다. 설치하기 위해서:

$ brew install coreutils

제공되는 내용을 볼 수 있습니다.

$ brew list coreutils

날짜와 함께 제공됩니다.

$ brew list coreutils | grep date

이것은 표준 GNU 날짜 명령이므로 -I 스위치를 사용합니다.

$ gdate -I
2016-08-09


답변

일반적인 date형식 지정 옵션을 사용하십시오.

date '+%Y-%m-%d'

편집 : 시간과 UTC를 포함하려면 다음과 같습니다.

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'


답변

Bash의 기능이 아니며 date바이너리 의 기능입니다 . Linux에서는 일반적으로 GNU coreutils 버전이 date있지만 OSX에는 BSD 레거시 유틸리티가 있습니다. GNU 버전은 반드시 옵션 패키지로 설치하거나 직접 교체 할 수 있습니다. 예를 들어 Perl과 같이 간단한 단일 라이너 여야한다고 생각합니다.


답변

다른 답변을 한 단계 더 발전 시키면 ~ / .bashrc 또는 ~ / .zshrc에 함수를 추가하여 날짜 -I플래그 를 추가 할 수 있습니다 .

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}