Namespaces
Variants

std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get

From cppreference.net
ヘッダーで定義 <locale>
public :

iter_type get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

const char_type * fmtbeg, const char_type * fmtend ) const ;
(1) (C++11以降)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, std:: ios_base & str,
std:: ios_base :: iostate & err, std:: tm * t,

char format, char modifier ) const ;
(2) (C++11以降)
1) 入力文字シーケンス [ beg, end ) から日付と時刻を解析し、文字シーケンス [ fmtbeg, fmtend ) で提供されるフォーマットに従って処理します。フォーマットは以下に説明する形式に従うことが期待されますが、各フォーマット指定子の実際の処理は do_get をオーバーライドすることでカスタマイズ可能です。 get 関数は以下の処理を実行します: まず、 err のエラービットを err = std:: ios_base :: goodbit を実行してクリアします。その後、以下の条件のいずれかが真になった時点で終了するループに入ります(この順序でチェックされます):
a) 書式文字列からすべての文字が読み取られました ( fmtbeg == fmtend )。
b) パースエラーが発生しました ( err ! = std:: ios_base :: goodbit )。
c) 入力シーケンスからすべての文字が読み込まれた場合 ( beg == end )。この条件でループが終了した場合、関数は eofbit failbit の両方を err に設定する。
ループ本体では、以下の手順が実行されます:
a) 書式文字列の次の文字が '%' であり、その後に1つまたは2つの文字が有効な std::get_time 変換指定子(下記参照)を形成する場合、これらの文字は do_get ( beg, end, str, err, t, format, modifier ) の呼び出しに使用されます。ここで format は主要な変換指定子文字、 modifier はオプションの修飾子(存在する場合は % と書式文字の間に表示される)です。修飾子がない場合、値 ' \0 ' が使用されます。書式文字列が曖昧であるか、 '%' の後の変換指定子を決定するには早く終了しすぎている場合、 eofbit err に設定され、ループが終了します。 do_get の呼び出し後、 err にエラービットが設定されていない場合、関数は fmtbeg を変換指定子の直後を指すようにインクリメントし、ループを継続します。
b) 次の文字が、ストリームで提供されたロケールで示される空白文字である場合 str (すなわち std:: isspace ( * fmtbeg, str. getloc ( ) ) == true )、この関数は fmtbeg fmtend と等しくなるか、非空白文字を指すようになるまで fmtbeg をインクリメントし続けます。
c) 書式文字列の次の文字が、大文字小文字を区別しない比較で入力ストリームの次の文字と等しい場合、関数は両方のシーケンスを1文字進め ++ fmtbeg, ++ beg ; ループを継続します。それ以外の場合、 failbit err に設定します。
2) 入力シーケンス [ beg, end ) から1つの変換指定子を解析し、それに応じて std::tm 構造体( t が指す)を更新します。
まず、 err のエラービットを err = std:: ios_base :: goodbit を実行してクリアします。次に入力シーケンス [ beg, end ) から文字を読み込み、 std::time_get のフォーマット指定子( '%' modifier ' \0 ' でない場合)、および format を組み合わせて形成される)で期待される形式を解析します。文字が有効な変換指定子を形成しない場合、 err failbit を設定します。文字を読み込んだ後に入力ストリームの終端に達した場合、 err eofbit を設定します。入力文字列が正常に解析された場合、 * t の対応するフィールドを更新します。
複雑な変換指定子、例えば '%x' '%c' 、または修飾子 'E' および 'O' を使用するディレクティブの場合、関数は * t に格納する値の一部を決定できない可能性があります。そのような場合、関数は eofbit err に設定し、これらのフィールドを未指定の状態のままにします。

目次

パラメータ

beg - 解析対象シーケンスの開始を指すイテレータ
end - 解析対象シーケンスの終端の次を指すイテレータ
str - この関数が必要に応じてロケールファセットを取得するために使用するストリームオブジェクト(例: std::ctype による空白文字のスキップや std::collate による文字列比較)
err - エラーを示すためにこの関数によって変更されるストリームエラーフラグオブジェクト
t - この関数呼び出しの結果を保持する std::tm オブジェクトへのポインタ
fmtbeg - 変換フォーマットを指定する char_type 文字シーケンスの先頭文字へのポインタ(後述参照)
fmtend - 変換フォーマットを指定する char_type 文字シーケンスの終端文字の次へのポインタ
format - 変換指定子を表す文字
modifier - % と変換指定子の間に現れるオプションの修飾子


書式文字列は、ゼロ個以上の変換指定子、空白文字、および通常の文字( % を除く)で構成されます。各通常の文字は、大文字小文字を区別しない比較で入力ストリーム内の1文字と一致することが期待されます。各空白文字は、入力文字列内の任意の空白と一致します。各変換指定は % 文字で始まり、オプションで E または O 修飾子(ロケールでサポートされていない場合は無視される)が続き、その後に指定子の動作を決定する文字が続きます。書式指定子はPOSIX関数 strptime() と一致します:

日本語訳: 変更点: - "synonym of" を「の同義語」に翻訳 - HTMLタグ、属性、 タグ内のテキスト(e, d, tm_mday)は翻訳せず保持 - 元のフォーマットと構造を完全に維持
変換指定子
(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)
指定されたフォーマットの日付/時刻値を解析する
(関数テンプレート)