MiServe DevTools

あなたのステッカー

ツールをここにピン留めできます。このブラウザに保存されます。

Go 時刻フォーマット・strftime 変換

Go の時刻レイアウトを書くと、そのレイアウトで現在時刻を表示します。Go のレイアウトと strftime を相互変換し、基準時刻のトークンも調べられます。

どちらの欄を編集しても、もう一方が追従します。

このレイアウトでの現在時刻

定義済みのレイアウト
基準時刻のトークン

Go の基準時刻は Mon Jan 2 15:04:05 MST 2006 です。01/02 03:04:05PM '06 -0700 と書くと、月、日、時、分、秒、年、タイムゾーンのオフセットが 1 から 7 まで順に並びます。 トークンを選ぶと、レイアウトのカーソル位置に挿入します。

Go トークン意味strftime現在
年(4 桁) %Y
年(下 2 桁) %y
月の数字(2 桁) %m
月の数字(ゼロ埋めなし) %-m
月名(省略形) %b
月名(完全形) %B
日(2 桁) %d
日(ゼロ埋めなし) %-d
日(空白で埋める) %e
年内の通算日(3 桁) %j
24 時間制の時(2 桁) %H
12 時間制の時(2 桁) %I
12 時間制の時(ゼロ埋めなし) %-I
分(2 桁) %M
秒(2 桁) %S
AM または PM %p
曜日名(省略形) %a
曜日名(完全形) %A
タイムゾーンの略称 %Z
UTC オフセット(時と分、コロンなし) %z
UTC オフセット(時と分、コロンあり) %:z
UTC オフセット(コロンあり)。オフセットが 0 のときは Z —
秒の小数部(固定桁数。0 の数だけ桁を表示) .%L
秒の小数部(末尾のゼロを省略。最大で 9 の数だけ桁を表示) —

WebAssembly を使ってブラウザ内で動作します。貼り付けた内容はアップロードされません。

このツールについて

レイアウトはパターンではなく見本

多くの言語では、%Y-%m-%d や YYYY-MM-DD のようなプレースホルダーで日付の形式を表します。Go のやり方は異なります。基準時刻という特定の 1 つの時点をどう表示したいかを書くと、time.Format がほかの時刻も同じように出力します。基準時刻は Mon Jan 2 15:04:05 MST 2006 です。

この値は、アメリカ式の順序で 01/02 03:04:05PM '06 -0700 と書いたときに数字が順に増えるように選ばれています。月が 1、日が 2、時が 3(24 時間制では 15)、分が 4、秒が 5、年が 6、タイムゾーンのオフセットがマイナス 7 時間です。それぞれの値は 1 つの意味しか持たないため、Go は 01 が月で 04 が分だと判別できます。

よくある間違い

01 が月、02 が日なので、日を先に書く日付は 02/01/2006 になります。基準の順序に慣れていないと、これは誤りに見えます。ほかの言語の書き方で書いたレイアウトも、エラーにはなりません。Go は認識できない部分をそのままテキストとして出力するので、YYYY-MM-DD は変わらずに出力されます。また、認識できる数字はすべてトークンとして読むので、2021-12-25 は無関係な数字の並びになります。

トークンをエスケープする方法はありません。トークンを含むテキストは置き換えられるため、レイアウト内に文字どおりの Jan や Mon、2 のような数字を書くと、値に変わってしまいます。そうしたテキストは、レイアウトの外で付け足してください。

Z07:00 は、UTC では Z、それ以外では数値のオフセットを出力します。これは RFC 3339 が求める形式です。一方、-07:00 は常に数値を出力します。秒の小数部は、.000 なら末尾のゼロを残し、.999 なら取り除きます。月名と曜日名は常に英語です。

プレビューと変換のしくみ

プレビューは、WebAssembly にコンパイルしてブラウザで実行している Go 標準ライブラリの time.Format が生成します。そのため、同じ時点とオフセットに対して Go のプログラムが出力するものと同じ結果を表示します。現在時刻、お使いのタイムゾーンの UTC オフセットとその略称はブラウザから取得します。ブラウザがタイムゾーンの略称を持たない場合は、+03 のような数値の略称を使います。これは、独自の英字の略称を持たないタイムゾーンに対して Go が出力するものと同じです。タイムゾーンによっては、ブラウザの略称が、Go が読み込むタイムゾーンデータベースの略称と異なる場合があります。

2 つの形式が表現できる範囲は同じではありません。strftime には Z07:00 のように動作する指定子がなく、Go には週番号(%U、%W、%V)、数値の曜日(%u、%w)、エポックからの秒数(%s)に対応するトークンがありません。変換ツールはそうした部分をそのまま残し、欄の下に表示します。また、strftime 形式に含まれる文字どおりのテキストのうち、Go がトークンとして読み取ってしまうものも表示します。レイアウトではそれを保持できないためです。

strftime 側の指定子の一部は、すべての実装にあるわけではない拡張です。ゼロ埋めを外すフラグ(%-d)、コロン付きのオフセット(%:z)、小数部の指定子 %L、%f、%N がそうです。変換先の言語のドキュメントを確認してください。

よくある質問

Go が YYYY-MM-DD ではなく 2006-01-02 15:04:05 を使うのはなぜですか?

Go のレイアウトは、固定の基準時刻 Mon Jan 2 15:04:05 MST 2006 をどう表示するかを示すものです。その各部分は月、日、時、分、秒、年、タイムゾーンのオフセットの順に 1 から 7 の数字になっているため、プレースホルダーの構文を使わなくても、どの数字が日付のどの部分かが一意に決まります。

ISO 8601 や RFC 3339 のタイムスタンプに対応する Go のレイアウトは何ですか?

2006-01-02T15:04:05Z07:00 を使います。これは定数 time.RFC3339 です。秒の小数部が必要なら、2006-01-02T15:04:05.999999999Z07:00 である time.RFC3339Nano を使ってください。

Go のレイアウトでミリ秒を出力するには?

15:04:05.000 のように、秒の後ろに .000 を付けます。0 の 1 つが 1 桁にあたるので、.000000 ならマイクロ秒になります。末尾のゼロを省くには、.999 のように 9 を使います。

Go のレイアウトで 24 時間制にするには?

時を 15 と書きます。03 や 3 は 12 時間制を表し、通常は AM または PM を出力する PM と組み合わせて使います。

時間のほかのツール