std::time_put<CharT,OutputIt>::put, std::time_put<CharT,OutputIt>::do_put
| ヘッダー <locale> で定義 |
||
| public: iter_type put( iter_type out, std::ios_base& str, |
(1) | |
| public: iter_type put( iter_type out, std::ios_base& str, |
(2) | |
| protected: virtual iter_type do_put( iter_type out, std::ios_base& str, |
(3) | |
tが指すstd::tmオブジェクトに格納されているカレンダー日時を、フォーマット文字列[fmtbeg, fmtend)に従って文字列表現に変換します。フォーマット文字列はstd::strftimeと同じものですが、各フォーマット指定子はdo_put()の個別の呼び出しによって処理されるため、このファセットを拡張することでカスタマイズできます。
[fmtbeg, fmtend)をステップ実行し、文字を検査します。フォーマットシーケンスの一部ではない各文字は、直ちに出力イテレータoutに書き込まれます。フォーマットシーケンスを識別するために、この関数は[fmtbeg, fmtend)内の次の文字cをstd::ctype<char_type>(str.getloc()).narrow(c, 0)のようにナローイングし、それが'%'と等しい場合、次の1つまたは2つの文字を、std::strftimeが認識するフォーマットシーケンスのリストおよびこのロケールでサポートされる追加の実装定義フォーマットと比較します。有効なフォーマットシーケンスごとに、do_put(out, str, fill, t, format, modifier)が呼び出されます。ここで、formatはフォーマットシーケンス文字、modifierはオプションのフォーマットシーケンス修飾子('E'または'O')です。修飾子が存在しない場合は'\0'の値が使用されます。do_putメンバ関数を呼び出します。tが指すstd::tmオブジェクトに格納されているカレンダー日時を、'%'、modifierの値('\0'でない場合)、およびformatの値をつなげたフォーマット変換シーケンスに従って文字列表現に変換します。フォーマットはstd::strftimeと同様に解釈されますが、ロケール依存として説明されているフォーマットはこのロケールによって定義され、追加のフォーマット指定子がサポートされる場合があります(fill引数は、これらの実装定義フォーマット指定子が使用するために提供されます)。文字列は出力イテレータoutに書き込まれます。目次 |
[編集] パラメータ
| out | - | 変換結果が書き込まれる出力イテレータ |
| str | - | 必要に応じてロケールファセット(例:文字をナローイングするためのstd::ctype)を取得するためにこの関数が使用するストリームオブジェクト |
| t | - | 日時値が取得されるstd::tmオブジェクトへのポインタ |
| fmtbeg | - | 変換フォーマットを指定するchar_type文字シーケンスの最初の文字へのポインタ |
| fmtend | - | 変換フォーマットを指定するchar_type文字シーケンスの最後の文字の次を指すポインタ |
| fill | - | フィル文字(通常はスペース) |
| format | - | 変換指定子の名前を付ける文字 |
| modifier | - | %と変換指定子の間に出現する可能性のあるオプションの修飾子 |
[編集] フォーマット文字列
フォーマット文字列は、0個以上の変換指定子と通常の文字(% を除く)で構成されます。すべての通常の文字(終端のヌル文字を含む)は、変更なしに出力文字列にコピーされます。各変換指定子は % 文字で始まり、オプションで E または O 修飾子(ロケールでサポートされていない場合は無視される)が続き、指定子の動作を決定する文字が続きます。次のフォーマット指定子が利用可能です。
| 変換 指定子 |
説明 | 使用されるフィールド |
|---|---|---|
%
|
リテラルの % を出力します。完全な変換指定子は %% である必要があります。 |
|
n(C++11) |
改行文字を出力します。 | |
t(C++11) |
水平タブ文字を出力します。 | |
| 年 | ||
Y
|
年を10進数で出力します。例: 2017 | tm_year
|
EY(C++11) |
ja_JP ロケールでの 2011年 (2011年) の代わりに、代替表現での年を出力します。例: 平成23年 (23年 平成) | tm_year
|
y
|
年の下2桁を10進数(範囲 [00,99])で出力します。 |
tm_year
|
Oy(C++11) |
ja_JP ロケールでの 11 の代わりに、代替数値システムを使用した年の下2桁を出力します。例: 十一 | tm_year
|
Ey(C++11) |
ロケールの代替暦期間 %EC からのオフセットとしての年を出力します(ロケール依存)。 |
tm_year
|
C(C++11) |
年の上2桁を10進数(範囲 [00,99])で出力します。 |
tm_year
|
EC(C++11) |
ja_JP ロケールでの 平成 (平成時代) のように、ロケールの代替表現での基となる年(期間)の名前を出力します。 | tm_year
|
G(C++11) |
指定された週を含むISO 8601 週ベースの年を出力します。 ISO 8601では、週は月曜日から始まり、その年の最初の週は次の要件を満たす必要があります。
|
tm_year、tm_wday、tm_yday |
g(C++11) |
指定された週を含むISO 8601 週ベースの年の下2桁(範囲 [00,99])を出力します。ISO 8601では、週は月曜日から始まり、その年の最初の週は次の要件を満たす必要があります。
|
tm_year、tm_wday、tm_yday |
| 月 | ||
b
|
(ロケール依存)省略月の名前を出力します。例: Oct |
tm_mon
|
h(C++11) |
b の同義語です。 |
tm_mon
|
B
|
(ロケール依存)月のフルネームを出力します。例: October |
tm_mon
|
m
|
月を10進数(範囲 [01,12])で出力します。 |
tm_mon
|
Om(C++11) |
ja_JP ロケールでの 12 の代わりに、代替数値システムを使用した月を出力します。例: 十二 | tm_mon
|
| 週 | ||
U
|
(日曜日を週の最初の曜日とした)年の週を10進数(範囲 [00,53])で出力します。 |
tm_year、tm_wday、tm_yday |
OU(C++11) |
ja_JP ロケールでの 52 の代わりに、%U と同様の年の週を代替数値システムを使用して出力します。例: 五十二 |
tm_year、tm_wday、tm_yday |
W
|
(月曜日を週の最初の曜日とした)年の週を10進数(範囲 [00,53])で出力します。 |
tm_year、tm_wday、tm_yday |
OW(C++11) |
ja_JP ロケールでの 52 の代わりに、%W と同様の年の週を代替数値システムを使用して出力します。例: 五十二 |
tm_year、tm_wday、tm_yday |
V(C++11) |
ISO 8601 の年の週(範囲 [01,53])を出力します。ISO 8601では、週は月曜日から始まり、その年の最初の週は次の要件を満たす必要があります。
|
tm_year、tm_wday、tm_yday |
OV(C++11) |
ja_JP ロケールでの 52 の代わりに、%V と同様の年の週を代替数値システムを使用して出力します。例: 五十二 |
tm_year、tm_wday、tm_yday |
| 年の日/月 | ||
j
|
年の日を10進数(範囲 [001,366])で出力します。 |
tm_yday
|
d
|
月のsilylを10進数(範囲 [01,31])で出力します。 |
tm_mday
|
Od(C++11) |
ja_JP ロケールでの 27 の代わりに、代替数値システムを使用した0ベースの月のsilylを出力します。例: 二十七 単一の文字の前にスペースが付きます。 |
tm_mday
|
e(C++11) |
月のsilylを10進数(範囲 [1,31])で出力します。単一の数字の前にスペースが付きます。 |
tm_mday
|
Oe(C++11) |
ja_JP ロケールでの 27 の代わりに、代替数値システムを使用した1ベースの月のsilylを出力します。例: 二十七 単一の文字の前にスペースが付きます。 |
tm_mday
|
| 曜日 | ||
a
|
(ロケール依存)省略曜日の名前を出力します。例: Fri |
tm_wday
|
A
|
(ロケール依存)曜日のフルネームを出力します。例: Friday |
tm_wday
|
w
|
曜日を10進数で出力します。日曜日が 0 です(範囲 [0-6])。 |
tm_wday
|
Ow(C++11) |
ja_JP ロケールでの 2 の代わりに、代替数値システムを使用した曜日(日曜日が 0)を出力します。例: 二 |
tm_wday
|
u(C++11) |
曜日を10進数で出力します。月曜日が 1 です(ISO 8601 形式)(範囲 [1-7])。 |
tm_wday
|
Ou(C++11) |
ja_JP ロケールでの 2 の代わりに、代替数値システムを使用した曜日(月曜日が 1)を出力します。例: 二 |
tm_wday
|
| 時、分、秒 | ||
H
|
時を24時間形式の10進数(範囲 [00-23])で出力します。 |
tm_hour
|
OH(C++11) |
ja_JP ロケールでの 18 の代わりに、代替数値システムを使用した24時間形式の時を出力します。例: 十八 | tm_hour
|
I
|
時を12時間形式の10進数(範囲 [01,12])で出力します。 |
tm_hour
|
OI(C++11) |
ja_JP ロケールでの 06 の代わりに、代替数値システムを使用した12時間形式の時を出力します。例: 六 | tm_hour
|
M
|
分を10進数(範囲 [00,59])で出力します。 |
tm_min
|
OM(C++11) |
ja_JP ロケールでの 25 の代わりに、代替数値システムを使用した分を出力します。例: 二十五 | tm_min
|
S
|
秒を10進数(範囲 [00,60])で出力します。 |
tm_sec
|
OS(C++11) |
ja_JP ロケールでの 24 の代わりに、代替数値システムを使用した秒を出力します。例: 二十四 | tm_sec
|
| その他 | ||
c
|
(ロケール依存)標準の日付と時刻の文字列を出力します。例: Sun Oct 17 04:41:13 2010 |
すべて |
Ec(C++11) |
ja_JP ロケールでの 2011年 (2011年) の代わりに、平成23年 (23年 平成) を使用するなど、代替の日付と時刻の文字列を出力します。 | すべて |
x
|
(ロケール依存)ローカライズされた日付表現を出力します。 | すべて |
Ex(C++11) |
ja_JP ロケールでの 2011年 (2011年) の代わりに、平成23年 (23年 平成) を使用するなど、代替の日付表現を出力します。 | すべて |
X
|
(ロケール依存)ローカライズされた時刻表現を出力します。例: 18:40:20 または 6:40:20 PM。 | すべて |
EX(C++11) |
(ロケール依存)代替の時刻表現を出力します。 | すべて |
D(C++11) |
"%m/%d/%y" と同等です。 | tm_mon、tm_mday、tm_year |
F(C++11) |
"%Y-%m-%d" (ISO 8601 日付フォーマット) と同等です。 | tm_mon、tm_mday、tm_year |
r(C++11) |
(ロケール依存)ローカライズされた12時間形式の時刻を出力します。 | tm_hour、tm_min、tm_sec |
R(C++11) |
"%H:%M" と同等です。 | tm_hour、tm_min |
T(C++11) |
"%H:%M:%S" (ISO 8601 時刻フォーマット) と同等です。 | tm_hour、tm_min、tm_sec |
p
|
(ロケール依存)ローカライズされた午前または午後を出力します。 | tm_hour
|
z(C++11) |
ISO 8601 形式でのUTCからのオフセット(例: -0430)を出力します。タイムゾーン情報が利用できない場合は何も出力しません。 |
tm_isdst
|
Z
|
(ロケール依存)タイムゾーン名または略称を出力します。タイムゾーン情報が利用できない場合は何も出力しません。 | tm_isdst
|
[編集] 戻り値
生成された最後の文字の次を指すイテレータ。
[編集] 注記
エラー処理は提供されていません。
fill文字は、実装定義のフォーマット指定子や、パディングおよびフィルロジックを使用するdo_put()のユーザー定義オーバーライドのために提供されます。そのような実装では、通常strからのフォーマットフラグが利用されます。
[編集] 例
#include <iostream> #include <sstream> #include <iomanip> #include <ctime> void try_time_put(const std::tm* t, const std::string& fmt) { std::cout.imbue(std::locale()); std::cout << "In the locale '" << std::cout.getloc().name() << "' : '"; std::use_facet<std::time_put<char>>(std::cout.getloc()).put( {std::cout}, std::cout, ' ', t, &fmt[0], &fmt[0] + fmt.size()); std::cout << "'\n"; } int main() { std::time_t t = std::time(NULL); std::tm tm = *std::localtime(&t); std::string fmt = "%c"; std::cout << "Using the format string '" << fmt << "' to format the time: " << std::ctime(&t) << '\n'; std::locale::global(std::locale("de_DE.utf8")); try_time_put(&tm, fmt); std::locale::global(std::locale("el_GR.utf8")); try_time_put(&tm, fmt); std::locale::global(std::locale("ja_JP.utf8")); try_time_put(&tm, fmt); }
実行結果の例
Using the format string '%c' to format the time: Mon Feb 11 22:58:50 2013 In the locale 'de_DE.utf8' : 'Mo 11 Feb 2013 23:02:38 EST' In the locale 'el_GR.utf8' : 'Δευ 11 Φεβ 2013 11:02:38 μμ EST' In the locale 'ja_JP.utf8' : '2013年02月11日 23時02分38秒'
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 164 | C++98 | パラメータfillの目的が不明確だった | 明確化された |
[編集] 関連項目
| (C++11) |
指定されたフォーマットに従って日付/時刻の値をフォーマットして出力する (関数テンプレート) |
| [virtual] (C++11) |
指定されたフォーマットに従って、入力ストリームから日付/時刻コンポーネントを抽出します。 ( std::time_get<CharT,InputIt>の仮想保護メンバ関数) |