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) | |
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
メンバー関数を呼び出します。
目次 |
パラメータ
| out | - | 変換結果が書き込まれる出力イテレータ |
| str | - | ロケールファセットが必要な際に使用するストリームオブジェクト(例:文字をナロー化するための std::ctype ) |
| t | - | 日付/時刻値を取得する std::tm オブジェクトへのポインタ |
| fmtbeg | - |
変換フォーマット
を指定する
char_type
文字シーケンスの先頭文字へのポインタ
|
| fmtend | - |
変換フォーマット
を指定する
char_type
文字シーケンスの終端文字(最後の文字の次)へのポインタ
|
| fill | - | フィル文字(通常はスペース) |
| format | - | 変換指定子 を指定する文字 |
| modifier | - |
%
と
変換指定子
の間に現れるオプションの修飾子
|
フォーマット文字列
書式文字列は、0個以上の変換指定子と(
%
以外の)通常の文字で構成されます。すべての通常の文字(終端のnull文字を含む)は変更されずに出力文字列にコピーされます。各変換指定は
%
文字で始まり、オプションで
E
または
O
修飾子(ロケールでサポートされていない場合は無視される)が続き、その後に指定子の動作を決定する文字が続きます。以下の書式指定子が利用可能です:
|
変換指定子
(Conversion specifier) |
説明 | 使用されるフィールド |
|---|---|---|
%
|
リテラル
%
を書き込む。完全な変換指定は
%%
でなければならない。
|
|
n
(C++11) |
改行文字を書き込む | |
t
(C++11) |
水平タブ文字を書き込む | |
| 年 | ||
Y
|
年を10進数で書き込みます、例: 2017 |
tm_year
|
EY
(C++11) |
代替表現で 年 を書き込みます。例:ja_JPロケールでは2011年 (year 2011) の代わりに平成23年 (year Heisei 23) |
tm_year
|
y
|
年の下2桁を10進数で書き込む(範囲
[00,99]
)
|
tm_year
|
Oy
(C++11) |
代替数値システムを使用して 年 の下2桁を書き込む。例:ja_JPロケールでは11の代わりに十一 |
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) |
代替数値システムを使用して
年間の週
を書き込みます。
%U
によるように、例えばja_JPロケールでは52の代わりに五十二
|
tm_year
,
tm_wday
,
tm_yday
|
W
|
年における週
を10進数で書き出す
(月曜日が週の最初の日)(範囲
[00,53]
)
|
tm_year
,
tm_wday
,
tm_yday
|
OW
(C++11) |
代替数値システムを使用して 年間の週 を書き込みます。例えばja_JPロケールでは52の代わりに五十二 |
tm_year
,
tm_wday
,
tm_yday
|
V
(C++11) |
ISO 8601 週番号
を書き込みます(範囲は
[01,53]
)。
ISO 8601では週は月曜日から始まり、年の最初の週は以下の要件を満たす必要があります:
|
tm_year
,
tm_wday
,
tm_yday
|
OV
(C++11) |
代替数値システムを使用して
年間の週
を書き込みます。
%V
によるもの、例えばja_JPロケールでは52の代わりに五十二
|
tm_year
,
tm_wday
,
tm_yday
|
| 年間/月間の日付 | ||
j
|
年通算日を10進数で出力(範囲
[001,366]
)
|
tm_yday
|
d
|
月の日を10進数で書き込む(範囲
[01,31]
)
|
tm_mday
|
Od
(C++11) |
代替数値システムを使用して0から始まる
月の日
を書き込む(例:ja_JPロケールでは27の代わりに二十七)
単一文字の前にはスペースが付きます。 |
tm_mday
|
e
(C++11) |
月の日を10進数で書き込みます(範囲
[1,31]
)。
1桁の数字の前にはスペースが付加されます。 |
tm_mday
|
Oe
(C++11) |
代替数値システムを使用して1から始まる
月の日
を書き込む。例えばja_JPロケールでは27の代わりに二十七
単一文字の場合は前にスペースが付く。 |
tm_mday
|
| 曜日 | ||
a
|
省略形の曜日名を書き込みます。例:
Fri
(ロケール依存)
|
tm_wday
|
A
|
完全な曜日名を書き込む、例:
Friday
(ロケール依存)
|
tm_wday
|
w
|
平日を10進数で書き込みます。日曜日は
0
となります(範囲
[0-6]
)
|
tm_wday
|
Ow
(C++11) |
weekday
を書き込みます。日曜日は
0
として、代替数値システムを使用します(例:ja_JPロケールでは2の代わりに二)
|
tm_wday
|
u
(C++11) |
weekday
を10進数で書き出し、月曜日を
1
とする(ISO 8601形式)(範囲
[1-7]
)
|
tm_wday
|
Ou
(C++11) |
weekday
を書き込みます。ここでは月曜日を
1
として、代替の数値システムを使用します(例:ja_JPロケールでは2の代わりに二)
|
tm_wday
|
| 時、分、秒 | ||
H
|
時間を10進数で書き込みます、24時間制(範囲
[00-23]
)
|
tm_hour
|
OH
(C++11) |
24時間制の 時間 を代替数値システムで書き込む(例:ja_JPロケールでは18の代わりに十八) |
tm_hour
|
I
|
時間を12時間制の10進数で書き込みます(範囲
[01,12]
)
|
tm_hour
|
OI
(C++11) |
12時間制で 時間 を代替数値システムを使用して書き込む、例:ja_JPロケールで06の代わりに六 |
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年 (year 2011) の代わりに平成23年 (year Heisei 23) を使用 | すべて |
x
|
ローカライズされた 日付表現 を書き込む (ロケール依存) | すべて |
Ex
(C++11) |
代替日付表現
を書き出す
例: ja_JPロケールで2011年 (year 2011) の代わりに平成23年 (year Heisei 23) を使用する |
すべて |
X
|
ローカライズされた 時刻表現 を書き込む (例: 18:40:20 または 6:40:20 PM(ロケール依存)) | すべて |
EX
(C++11) |
代替時間表現
を書き込む
(ロケール依存) |
すべて |
D
(C++11) |
equivalent to "%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) |
equivalent to "%H:%M" |
tm_hour
,
tm_min
|
R
(C++11) |
equivalent to "%H:%M" |
tm_hour
,
tm_min
|
R
(C++11) |
「%H:%M」に相当 "%H:%M" |
tm_hour
,
tm_min
|
T
(C++11) |
equivalent to "%H:%M:%S" (the ISO 8601 time format) |
tm_hour
,
tm_min
,
tm_sec
|
T
(C++11) |
"%H:%M:%S" と同等 (ISO 8601 時刻形式) |
tm_hour
,
tm_min
,
tm_sec
|
p
|
ローカライズされた a.m. または p.m. を書き込む (ロケール依存) |
tm_hour
|
z
(C++11) |
UTCからの
オフセット
をISO 8601形式で書き込む(例:
-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>
の仮想保護メンバー関数)
|