std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get
|
ヘッダーで定義
<locale>
|
||
|
public
:
iter_type get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(1) | (C++11以降) |
|
protected
:
virtual
iter_type do_get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(2) | (C++11以降) |
do_get
をオーバーライドすることでカスタマイズ可能です。
get
関数は以下の処理を実行します:
まず、
err
のエラービットを
err
=
std::
ios_base
::
goodbit
を実行してクリアします。その後、以下の条件のいずれかが真になった時点で終了するループに入ります(この順序でチェックされます):
eofbit
と
failbit
の両方を
err
に設定する。
-
- ループ本体では、以下の手順が実行されます:
%
と書式文字の間に表示される)です。修飾子がない場合、値
'
\0
'
が使用されます。書式文字列が曖昧であるか、
'%'
の後の変換指定子を決定するには早く終了しすぎている場合、
eofbit
が
err
に設定され、ループが終了します。
do_get
の呼び出し後、
err
にエラービットが設定されていない場合、関数は
fmtbeg
を変換指定子の直後を指すようにインクリメントし、ループを継続します。
failbit
を
err
に設定します。
-
-
まず、
err
のエラービットを
err
=
std::
ios_base
::
goodbit
を実行してクリアします。次に入力シーケンス
[
beg, end
)
から文字を読み込み、
std::time_get
のフォーマット指定子(
'%'
、
modifier
(
'
\0
'
でない場合)、および
format
を組み合わせて形成される)で期待される形式を解析します。文字が有効な変換指定子を形成しない場合、
err
に
failbitを設定します。文字を読み込んだ後に入力ストリームの終端に達した場合、 err にeofbitを設定します。入力文字列が正常に解析された場合、 * t の対応するフィールドを更新します。
-
まず、
err
のエラービットを
err
=
std::
ios_base
::
goodbit
を実行してクリアします。次に入力シーケンス
[
beg, end
)
から文字を読み込み、
std::time_get
のフォーマット指定子(
'%'
、
modifier
(
'
\0
'
でない場合)、および
format
を組み合わせて形成される)で期待される形式を解析します。文字が有効な変換指定子を形成しない場合、
err
に
-
-
複雑な変換指定子、例えば
'%x'
や
'%c'
、または修飾子
'E'
および
'O'
を使用するディレクティブの場合、関数は
*
t
に格納する値の一部を決定できない可能性があります。そのような場合、関数は
eofbitを err に設定し、これらのフィールドを未指定の状態のままにします。
-
複雑な変換指定子、例えば
'%x'
や
'%c'
、または修飾子
'E'
および
'O'
を使用するディレクティブの場合、関数は
*
t
に格納する値の一部を決定できない可能性があります。そのような場合、関数は
目次 |
パラメータ
| beg | - | 解析対象シーケンスの開始を指すイテレータ |
| end | - | 解析対象シーケンスの終端の次を指すイテレータ |
| str | - | この関数が必要に応じてロケールファセットを取得するために使用するストリームオブジェクト(例: std::ctype による空白文字のスキップや std::collate による文字列比較) |
| err | - | エラーを示すためにこの関数によって変更されるストリームエラーフラグオブジェクト |
| t | - | この関数呼び出しの結果を保持する std::tm オブジェクトへのポインタ |
| fmtbeg | - |
変換フォーマットを指定する
char_type
文字シーケンスの先頭文字へのポインタ(後述参照)
|
| fmtend | - |
変換フォーマットを指定する
char_type
文字シーケンスの終端文字の次へのポインタ
|
| format | - | 変換指定子を表す文字 |
| modifier | - |
%
と変換指定子の間に現れるオプションの修飾子
|
書式文字列は、ゼロ個以上の変換指定子、空白文字、および通常の文字(
%
を除く)で構成されます。各通常の文字は、大文字小文字を区別しない比較で入力ストリーム内の1文字と一致することが期待されます。各空白文字は、入力文字列内の任意の空白と一致します。各変換指定は
%
文字で始まり、オプションで
E
または
O
修飾子(ロケールでサポートされていない場合は無視される)が続き、その後に指定子の動作を決定する文字が続きます。書式指定子はPOSIX関数
strptime()
と一致します:
|
変換指定子
(Conversion specifier) |
説明 | 書き込み先フィールド |
|---|---|---|
%
|
リテラルの
%
に一致します。完全な変換指定は
%%
でなければなりません
|
(なし) |
t
|
任意の空白文字に一致 | (なし) |
n
|
任意の空白文字にマッチ | (なし) |
| 年 | ||
Y
|
完全な 年 を4桁の10進数として解析、先行ゼロは許可されるが必須ではない |
tm_year
|
EY
|
代替表現で 年 を解析します。例: 平成23年 (year Heisei 23) はja_JPロケールでtm_yearに2011を書き込みます |
tm_year
|
y
|
年の下2桁を10進数として解析します。範囲
[69,99]
は1969年から1999年となり、範囲
[00,68]
は2000年から2068年となります
|
tm_year
|
Oy
|
年の下2桁を代替数値システムで解析します。例:ja_JPロケールでは「十一」は11として解析されます |
tm_year
|
Ey
|
ロケールの代替暦期間
%EC
からのオフセットとして
year
を解析します
|
tm_year
|
C
|
year
の最初の2桁を10進数(範囲
[00,99]
)として解析する
|
tm_year
|
EC
|
ロケールの代替表現における基準年(期間)の名称を解析します。例:ja_JPにおける平成 |
tm_year
|
| 月 | ||
b
|
月の名前を解析します(完全形または省略形)、例:
Oct
|
tm_mon
|
h
|
b
の同義語
|
tm_mon
|
B
|
b
の同義語
|
tm_mon
|
m
|
月を10進数で解析します(範囲
[01,12]
)、先行ゼロは許可されますが必須ではありません
|
tm_mon
|
Om
|
代替数値システムを使用して 月 を解析します。例:ja_JPロケールでは「十二」が12として解析されます |
tm_mon
|
| 週 | ||
U
|
週番号を10進数として解析する
(日曜日が週の最初の日)
(範囲
[00,53]
)、先行ゼロは許可されるが必須ではない
|
tm_year
,
tm_wday
,
tm_yday
|
OU
|
代替数値システムを使用して 年間の週 を解析します(例:%Uと同様)。ja_JPロケールでは「五十二」が52として解析されます |
tm_year
、
tm_wday
、
tm_yday
|
W
|
週番号を10進数で解析する(月曜日が週の最初の日)(範囲
[00,53]
)、先行ゼロは許可されるが必須ではない
|
tm_year
,
tm_wday
,
tm_yday
|
OW
|
代替数値システムを使用して
年間の週
を解析します(例:ja_JPロケールでは「五十二」が52として解析されます)。
%W
と同様の動作です。
|
tm_year
、
tm_wday
、
tm_yday
|
| 年間/月間の日付 | ||
j
|
年通算日を10進数で解析します(範囲
[001,366]
)、先行ゼロは許可されますが必須ではありません
|
tm_yday
|
d
|
月の日を10進数で解析する(範囲
[01,31]
)、先行ゼロは許可されるが必須ではない
|
tm_mday
|
Od
|
代替数値システムを使用して 月の日 を解析します。例:ja_JPロケールでは二十七が27として解析されます。先行ゼロは許可されますが必須ではありません |
tm_mday
|
e
|
synonym of
d
|
tm_mday
|
e
|
d
の同義語
|
tm_mday
|
Oe
|
Od
の同義語
|
tm_mday
|
| 曜日 | ||
a
|
曜日の名前を解析します(完全形または省略形)、例:
Fri
|
tm_wday
|
A
|
a
の同義語
|
tm_wday
|
w
|
平日を10進数として解析します。日曜日は
0
となります(範囲
[0-6]
)
|
tm_wday
|
Ow
|
代替数値システムを使用して
weekday
を10進数として解析します。日曜日は
0
として扱われます。例: ja_JPロケールでは「二」が2として解析されます
|
tm_wday
|
| 時、分、秒 | ||
H
|
時間を10進数で解析します(24時間制、範囲
[00-23]
)。先行ゼロは許可されますが必須ではありません
|
tm_hour
|
OH
|
24時間制から 時 を代替数値システムで解析します。例: ja_JPロケールでは「十八」が18として解析されます |
tm_hour
|
I
|
12時間制で
hour
を10進数として解析します(範囲
[01,12]
)。先行ゼロは許可されますが必須ではありません
|
tm_hour
|
OI
|
代替数値システムを使用して12時間制から hour を解析します。例:ja_JPロケールでは「六」は06として読み取られます |
tm_hour
|
M
|
分を10進数で解析(範囲
[00,59]
)、先行ゼロは許可されるが必須ではない
|
tm_min
|
OM
|
代替数値システムを使用して 分 を解析します。例:ja_JPロケールでは「二十五」が25として解析されます |
tm_min
|
S
|
秒を10進数(範囲
[00,60]
)として解析します。先行ゼロは許可されますが必須ではありません
|
tm_sec
|
OS
|
代替数値システムを使用して second を解析します。例: ja_JPロケールでは二十四が24として解析されます |
tm_sec
|
| その他 | ||
c
|
ロケールの標準日時文字列形式を解析します。例:
Sun Oct 17 04:41:13 2010
(ロケール依存)
|
すべて |
Ec
|
ロケールの代替日時文字列形式を解析します。例:ja_JPロケールでは2011年 (year 2011) の代わりに平成23年 (year Heisei 23) を期待します | すべて |
x
|
ロケールの標準日付表現を解析します | すべて |
Ex
|
ロケールの代替日付表現を解析します。例:ja_JPロケールでは2011年(年2011)の代わりに平成23年(平成23年)を期待します | all |
X
|
ロケールの標準時間表現を解析する | すべて |
EX
|
ロケールの代替時間表現を解析する | すべて |
D
|
"%m / %d / %y " に相当 |
tm_mon
,
tm_mday
,
tm_year
|
r
|
ロケールの標準12時間制時刻を解析する (POSIXでは、 "%I : %M : %S %p" ) |
tm_hour
,
tm_min
,
tm_sec
|
R
|
次と同等 "%H : %M" |
tm_hour
,
tm_min
|
T
|
次と同等 "%H : %M : %S" |
tm_hour
,
tm_min
,
tm_sec
|
p
|
ロケールに対応する 午前または午後 を解析します |
tm_hour
|
注記:
tm_isdst
は書き込まれず、
mktime
などの関数で使用するには明示的に設定する必要があります。
戻り値
正常に解析された最後の文字の次の位置を指すイテレータ。 [ beg, end ) の範囲内で。
注記
書式文字列内の空白文字および '%' 以外の文字に対する大文字小文字を区別しない比較には、 str によって提供されるロケールの std::collate ファセットが通常(必ずしもそうとは限らないが)使用されます。
構文解析エラーが発生した場合、この関数の多くの実装では * t を完全に変更しないままにします。
これらの関数が直接設定しない
*
t
のフィールドをゼロクリアするかどうかは未規定です:移植性のあるプログラムは
get()
を呼び出す前にすべてのフィールドをゼロに初期化する必要があります。
例
#include <iomanip> #include <iostream> #include <locale> #include <sstream> int main() { std::istringstream ss("2026-März-12 23:45:56"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(ss.getloc()); std::tm t{}; std::string s = "%Y-%b-%d %H:%M:%S"; std::ios_base::iostate err = std::ios_base::goodbit; auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size()); ss.setstate(err); std::istreambuf_iterator<char> last{}; if (ss) { std::cout << "Successfully parsed as " << std::put_time(&t, "%c") << '\n'; if (ret != last) { std::cout << "Remaining content: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else std::cout << "The input was fully consumed."; } else { std::cout << "Parse failed.\nUnparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
出力:
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
関連項目
|
(C++11)
|
指定されたフォーマットの日付/時刻値を解析する
(関数テンプレート) |