RFC-3339形式で日付を印刷するための標準コマンドとは何ですか?


18

dateコマンドは、RFC-3339は、(どちらも現代でも正気である電子メールを除き)どこでも使用現代的な、広範囲の、まともな形式であるため、一種悲しいのですそんなことを、提供していません。

私のタイムゾーンオフセットは現在-08:00であるため、このコマンドの最も単純な形式では、現在の時刻をとして出力する必要があります2013-09-05T14:58:33.102-08:00


どの規格に興味がありますか?
ステファンシャゼル14年

私は個人的にはGNUで大丈夫ですが、物事の壮大な計画では、それは本当にそれよりも広くあるべきです。また、合理的なデフォルト(短いオプション、ミリ秒精度)で来て、秒以下の精度(0または9以外の桁数)を指定する方法を持っている必要があります。
マーティンジャンボン14年

1
これは健全な形式ではありません。空白がまったくないため、人間が読むのが不必要に難しくなります。2013-09-05 14:58:33.102 -0800スペースをまったく使用してはならない理由がある場合を除き、わずかなバリエーションを使用する必要があります。
zwol 14年

1
人間と機械の両方にとって読みにくいメール日付形式(RFC 822、2822)と比較していました。
マーティンジャンボン14年

回答:


30

date(バージョン5.90以降)のGNU実装への切り替えを使用して、いくつかの形式を実行できるようです--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」を含みます。
チタン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パートのみを読んで、メモを逃しました。それを指摘してくれてありがとう!
エオニル

18

GNU date(5.90以降)の場合:

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

交換する%N%3N、ミリ秒%6N、マイクロ秒の...

知る限り、POSIX、Unix、LSBのいずれの仕様も、1秒未満の粒度で時間を表示できるコマンドを指定していませんが、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の日付を具体的に求めていると思います形式「完全な日付と時間、分、秒、秒の小数部YYYY-MM-DDThh:mm:ss.sTZD」(たとえば1997-07-16T19:20:01 + 30.45:00)」 - W3Cの日付と時刻の形式
hakre 14年

8

古き良き:

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

タイムゾーン情報はどこにありますか?
ラファエルアーレンス

これは、MacとLinuxの両方の「日付」で動作します
Eran Chetzroni

1
ミリ秒はどうですか?
マーティンジャンボン

6
ここで簡単に注意してください。タイムゾーンセグメントであるRFCを開くことなく0200、コロンが欠落しているため、それを必要とする一部のシステムが破損する可能性があります。
マイク・マッキントッシュ

2
@MikeMackintoshのメモは適切です。ここに表示される出力、正当なRFC 3339の日付ではありません。RFC 3339にはタイムゾーンセグメントのコロンが必要です。定義を参照time-numoffsettools.ietf.org/html/rfc3339#section-5.6を
マークアメリー

7

また、RFC3339(ISO8601)に従って時間をより簡単にフォーマットできます。

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

注:この形式は、Label Schema Convention RC 1.0でも使用されます。


これは有効なRFC3339ではありません。「日付+%Y-%m-%dT%T%z」のエランの答えは「」であり、文字数は少なくなります。UTCパスに-uフラグが必要な場合は、タイムゾーンオフセットをゼロにします。
ブライスバーグ

-uフラグがあれば、この答えは正しいですか?
ラッシー

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.