名前空間
変種
操作

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

From cppreference.com
< cpp‎ | locale‎ | time get
 
 
 
 
 
ヘッダー <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 = std::ios_base::goodbit を実行して err のエラービットをクリアします。次にループに入り、以下のいずれかの条件が真になるとループが終了します(この順序でチェックされます)。
a) フォーマット文字列からすべての文字が読み取られた (fmtbeg = fmtend)。
b) 解析エラーが発生した (err != std::ios_base::goodbit)。
c) 入力シーケンスからすべての文字が読み取られた (beg = end。この条件でループが終了した場合、関数は erreofbitfailbit の両方を設定します。
ループ本体では、以下のステップが実行されます。
a) フォーマット文字列の次の文字が '%' で、その後に std::get_time の有効な変換指定子を形成する 1 文字または 2 文字が続く場合(下記参照)、これらの文字は do_get(beg, end, str, err, t, format, modifier) の呼び出しで使用されます。ここで format は主要な変換指定子文字、modifier はオプションの修飾子(存在する場合、% とフォーマット文字の間に現れます)です。修飾子がない場合は、値 '\0' が使用されます。フォーマット文字列が曖昧であるか、'%' の後に変換指定子を決定するには早すぎる場合、eofbiterr に設定され、ループは終了します。do_get の呼び出し後、err にエラービットが設定されていない場合、関数は変換指定子の直後を指すように fmtbeg をインクリメントし、ループを続行します。
b) 次の文字がストリーム str で提供されるロケールによって空白文字として示される場合(つまり、std::isspace(*fmtbeg, str.getloc()) = true)、関数は fmtbegfmtend と等しくなるか、空白でない文字を指すまで fmtbeg をインクリメントし続けます。
c) フォーマット文字列の次の文字が、大文字・小文字を区別しない比較によって入力ストリームの次の文字と等しい場合、関数は両方のシーケンスを 1 文字進めます (++fmtbeg, ++beg;)。そうでない場合、errfailbit を設定します。
2) 入力シーケンス [beg, end) から 1 つの変換指定子を解析し、t が指す std::tm 構造体をそれに応じて更新します。
まず、err = std::ios_base::goodbit を実行して err のエラービットをクリアします。次に、入力シーケンス [beg, end) から、'%'modifier'\0' でない場合)、および format を組み合わせて形成される std::time_get フォーマット指定子によって期待される文字を読み取ります。文字が有効な変換指定子を形成しない場合、errfailbit を設定します。入力ストリームの末尾に文字を読み取った後に到達した場合、erreofbit を設定します。入力文字列が正常に解析された場合、*t の対応するフィールドを更新します。
複雑な変換指定子(例: '%x' または '%c')や、修飾子 'E' および 'O' を使用するディレクティブの場合、関数は *t に格納する一部の値の決定に失敗する可能性があります。この場合、erreofbit を設定し、これらのフィールドは未指定の状態のままにします。

目次

[編集] パラメーター

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


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

変換
指定子
説明 フィールドへの書き込み
% リテラルの % に一致します。完全な変換指定子は %% でなければなりません。 (なし)
t 任意の空白文字に一致します。 (なし)
n 任意の空白文字に一致します。 (なし)
Y 4桁の 10 進数として**年**を解析します。先頭のゼロは許可されますが、必須ではありません。 tm_year
EY ja_JP ロケールで、平成23年(西暦2011年)のような代替表現で**年**を解析します。 tm_year
y 年の下 2 桁を 10 進数として解析します。範囲 [69,99] は 1969年から1999年、範囲 [00,68] は 2000年から2068年になります。 tm_year
Oy 年の下 2 桁を代替数値システムを使用して解析します。例: ja_JP ロケールで十(じゅう)を 10 として解析します。 tm_year
Ey ロケールの代替暦期間 %EC からのオフセットとして**年**を解析します。 tm_year
C 年の最初の 2 桁を 10 進数として解析します(範囲 [00,99])。 tm_year
EC ja_JP ロケールで、平成(Heisei era)のような、ロケールの代替表現での基準年(期間)の名前を解析します。 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_yeartm_wdaytm_yday
OU ja_JP ロケールで、五十二(ごじゅうに)を 52 として解析するような、代替数値システムを使用した**年の週**(%U のように)を解析します。 tm_yeartm_wdaytm_yday
W 10 進数として**年の週**を解析します(月曜日が週の最初の曜日)(範囲 [00,53])。先頭のゼロは許可されますが、必須ではありません。 tm_yeartm_wdaytm_yday
OW ja_JP ロケールで、五十二(ごじゅうに)を 52 として解析するような、代替数値システムを使用した**年の週**(%W のように)を解析します。 tm_yeartm_wdaytm_yday
年の日/月
j 10 進数として**年の日数**を解析します(範囲 [001,366])。先頭のゼロは許可されますが、必須ではありません。 tm_yday
d 10 進数として**月の日の数**を解析します(範囲 [01,31])。先頭のゼロは許可されますが、必須ではありません。 tm_mday
Od ja_JP ロケールで、二十七(にじゅうしち)を 27 として解析するような、代替数値システムを使用して**月の日の数**を解析します。先頭のゼロは許可されますが、必須ではありません。 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 ja_JP ロケールで、二(に)を 2 として解析するような、代替数値システムを使用して曜日を 10 進数として解析します。日曜日が 0 です。 tm_wday
時、分、秒
H 24 時間制の**時**を 10 進数として解析します(範囲 [00-23])。先頭のゼロは許可されますが、必須ではありません。 tm_hour
OH ja_JP ロケールで、十八(じゅうはち)を 18 として解析するような、代替数値システムを使用して 24 時間制の**時**を解析します。 tm_hour
I 12 時間制の**時**を 10 進数として解析します(範囲 [01,12])。先頭のゼロは許可されますが、必須ではありません。 tm_hour
OI ja_JP ロケールで、六(ろく)を 06 として解析するような、代替数値システムを使用して 12 時間制の**時**を解析します。 tm_hour
M 10 進数として**分**を解析します(範囲 [00,59])。先頭のゼロは許可されますが、必須ではありません。 tm_min
OM ja_JP ロケールで、二十五(にじゅうご)を 25 として解析するような、代替数値システムを使用して**分**を解析します。 tm_min
S 10 進数として**秒**を解析します(範囲 [00,60])。先頭のゼロは許可されますが、必須ではありません。 tm_sec
OS ja_JP ロケールで、二十四(にじゅうし)を 24 として解析するような、代替数値システムを使用して**秒**を解析します。 tm_sec
その他
c ja_JP ロケールのような、ロケールの標準的な日付と時刻の文字列フォーマットを解析します。例: Sun Oct 17 04:41:13 2010(ロケール依存)。 すべて
Ec ja_JP ロケールで、2011年(西暦2011年)の代わりに平成23年(西暦2011年)を期待するような、ロケールの代替日付と時刻の文字列フォーマットを解析します。 すべて
x ロケールの標準的な日付表現を解析します。 すべて
Ex ja_JP ロケールで、2011年(西暦2011年)の代わりに平成23年(西暦2011年)を期待するような、ロケールの代替日付表現を解析します。 すべて
X ロケールの標準的な時刻表現を解析します。 すべて
EX ロケールの代替時刻表現を解析します。 すべて
D "%m / %d / %y " に相当します。 tm_montm_mdaytm_year
r POSIX では "%I : %M : %S %p" のような、ロケールの標準的な 12 時間制時刻を解析します。 tm_hourtm_mintm_sec
R "%H : %M" に相当します。 tm_hourtm_min
T "%H : %M : %S" に相当します。 tm_hourtm_mintm_sec
p ロケールにおける **a.m. または p.m.** に相当するものを解析します。 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)
指定されたフォーマットの日付/時刻の値を構文解析する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)