RFC-3339 형식으로 날짜를 인쇄하기위한 표준 명령은 무엇입니까?


19

date명령은 RFC-3339는 (도 현대도 제정신 이메일 제외) 모든 곳에서 사용되는 현대, 광범위하게, 제정신 형식이기 때문에 일종의 슬픈입니다 같은 일을, 제공하지 않습니다.

시간대 오프셋은 현재 -08 : 00이므로이 명령의 가장 간단한 형식은 현재 시간을로 인쇄해야합니다 2013-09-05T14:58:33.102-08:00.


어떤 표준에 관심이 있습니까?
Stéphane Chazelas

저는 개인적으로 GNU를 사용하는 것이 좋지만 웅장한 계획에서는 실제로 그보다 더 넓어야합니다. 또한 합리적인 기본값 (짧은 옵션, 밀리 초 정밀도)을 제공해야하며 1 초 이하의 정밀도 (0 또는 9 이외의 자릿수)를 지정하는 방법이 있어야합니다.
Martin Jambon

1
이 형식은 제정신 이 아닙니다 . 공백이 없기 때문에 사람이 불필요하게 읽기가 어렵습니다. 2013-09-05 14:58:33.102 -0800공백을 전혀 사용하지 않아야하는 이유가있는 경우를 제외하고 약간의 변형을 사용해야합니다.
zwol

1
나는 그것을 인간과 기계 모두에게 읽기 어려운 우편 날짜 형식 (RFC 822, 2822)과 비교하고 있었다.
Martin Jambon

답변:


30

GNU 구현 date(버전 5.90 이상)으로 전환하여 여러 형식을 수행 할 수있는 것처럼 보입니다 --rfc3339=.

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

T해킹으로 추가 하려면 다음 을 수행하십시오.

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

밀리 초 단위로 원하는 경우 :

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

참고 문헌


7
요즘 'T'를 얻기 위해 해킹이 필요하지 않습니다. --iso-8601' option accepts the same arguments as --rfc-3339`하고 그 출력의 'T'를 포함한다.
Ti Strga

1
sed 부분 s/\(\....\).*-/\1-/gs/\(\....\).*\([+-]\)/\1\2/g또한 대서양의 동쪽에서 일 해야합니다 .
svante

1
@ svante-세부 사항에 감사드립니다.
slm

2
실제로 올바르지 않은 @Eonil은 RFC3339는 다음과 같이 말합니다. NOTE: ISO 8601 defines date and time separated by "T".RFC3339에서는 대신 공백을 사용할 수 있습니다. 읽기 ietf.org/rfc/rfc3339.txt 5.6 절
rwenz3l

1
@ rwenz3l 내 잘못이다. 나는 단지 ABNF 부분만을 읽었고 메모를 놓쳤다. 지적 해 주셔서 감사합니다!
Eonil

18

GNU date(5.90 이상) :

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

교체 %N%3N, 밀리 초 %6N마이크로 초 ...

AFAIK, POSIX, Unix 또는 LSB 사양 중 어느 것도 초 미만의 단위로 시간을 표시 할 수있는 명령을 지정하지 않지만 RFC 3339에서는 소수 부분이 선택 사항입니다.

POSIX / Unix / LSB strftime은 %zTZ 오프셋을로 표시하도록 지원 -0800하므로 가장 이식성이 좋은 것은 다음과 같습니다.

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

GNU date에는 ISO-8601 형식이 내장되어 있습니다. RFC-3339와 매우 유사하거나 동일하지 않습니까?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601은 날짜와 시간의 형식을 다르게 지정할 수 있지만 OP는 W3C 날짜 형식을 구체적으로 요구한다고 생각합니다 . "(00 : 20 : 30.45 + 01 1997-07-16T19 예) - W3C의 날짜 및 시간 형식 .
hakre

8

좋은 나이는 어떻습니까?

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

시간대 정보는 어디에 있습니까?
Raphael Ahrens

이것은 맥과 리눅스 모두 '날짜'에서 작동합니다
Eran Chetzroni

1
밀리 초는 어때요?
Martin Jambon

6
시간대 세그먼트 인 RFC를 열지 않으면 여기에 빠른 참고 사항 0200이 있으며 콜론이 없어서 일부 시스템이 중단 될 수 있습니다.
마이크 맥킨토시

2
@MikeMackintosh의 메모는 적절합니다. 여기에 표시된 출력 은 유효한 RFC 3339 날짜 가 아닙니다 . 시간대 세그먼트의 콜론은 RFC 3339에 필요합니다. 의 정의 참조 time-numoffset에서 tools.ietf.org/html/rfc3339#section-5.6을 .
Mark Amery

7

RFC3339 (ISO8601) 에 따라 시간을 더 쉽게 형식화 할 수도 있습니다 .

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

참고 : 이 형식은 Label Schema Convention RC 1.0 에서도 사용됩니다.


유효한 RFC3339가 아닙니다. Eran의```date + % Y- % m- % dT % T % z```에 대한 답은 정확하고 적은 문자입니다. UTC pass -u 플래그를 원하면 시간대 오프셋을 0으로 만듭니다.
briceburg

으로 -u깃발이 답변이 정확 권리는 무엇입니까?
Lassi

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

이러한 명령은 %z변환 사양을 제외하고 POSIX와 호환됩니다 . 그러나 %zLinux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix 및 Haiku에서 널리 지원되며 동일한 방식으로 작동합니다. 또한 Busybox, Toybox 및 sbase (suckless.org 기본 시스템 유틸리티)의 도구와 함께 작동합니다. %z시간대 오프셋 ±HHMM형식으로 출력 하므로 sed콜론을 추가하고로 변경 하려면 파이프 가 필요합니다 ±HH:MM.

참고 : Heirloom 프로젝트의 date명령에는 호환되지 않는 %z출력이 있습니다. +부호를 인쇄하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.