名前空間
変種
操作

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

提供: 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) 文字シーケンス [fmtbeg, fmtend) に提供される書式に従って入力文字シーケンス [beg, end) から日付と時間を解析します。 書式は後述する書式に従うことが期待されますが、各書式指定子の実際の処理は 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' が使用されます。 書式文字列が曖昧な場合、または '%' の後の変換指定子を決定するより早く終了した場合は、 erreofbit がセットされ、ループが終了されます。 do_get の呼び出し後、 err にエラービットがセットされていなければ、この関数は変換指定子の直後を指すように fmtbeg をインクリメントし、ループを継続します。
b) ストリーム str で提供されるロケールによって示されるところによれば次の文字がホワイトスペースである (すなわち std::isspace(*fmtbeg, str.getloc()) == true) 場合、この関数は fmtend と等しくなるか非ホワイトスペース文字を指すまで fmtbeg をインクリメントし続けます。
c) 書式文字列の次の文字が入力ストリームの次の文字と大文字小文字を区別しない比較に従って同等であれば、この関数は両方のシーケンスを1文字進め (++fmtbeg, ++beg;)、そうでなければ、 errfailbit をセットします。
2) 入力シーケンス [beg, end) から変換指定子をひとつ解析し、それに応じて t の指す std::tm 構造体を更新します。
まず、 err = std::ios_base::goodbit を実行することによって err のエラービットをクリアします。 その後、 '%'modifier ('\0' でない場合) および format を組み合わせることによって形成される std::time_get の書式指定子によって期待される入力シーケンス [beg, end) から文字を読み込みます。 文字が有効な変換指定子を形成するために組み合わせられない場合は、 erreofbit をセットします。 文字を読み込んだ後、入力ストリームの終端に達した場合は、 erreofbit をセットします。 入力文字列の解析に成功した場合は、 *t の対応するフィールドを更新します。
'%x''%c' などの複雑な変換指定子や、修飾子 'E' および 'O' を使用する指令については、この関数は *t に格納する値のいくつかを決定するのに失敗するかもしれません。 そのような場合は、 erreofbit をセットし、これらの状態を未規定な状態に置きます。

目次

[編集] 引数

beg - 解析するシーケンスの開始を指定するイテレータ
end - 解析するシーケンスの終端イテレータ
str - 必要なときにロケールのファセットを取得するためにこの関数が使用するストリームオブジェクト (例えばホワイトスペースをスキップするための std::ctype や文字列を比較するための std::collate)
err - エラーを示すためにこの関数によって変更されるストリームエラーフラグオブジェクト
t - この関数呼び出しの結果を保持する std::tm オブジェクトへのポインタ
fmtbeg - 変換の書式を指定する char_type 文字のシーケンスの最初の文字へのポインタ。

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

変換指定子 説明 書き込むフィールド
% % にマッチします。 変換指定全体が %% でなければなりません。 (なし)
t 任意のホワイトスペースにマッチします。 (なし)
n 任意のホワイトスペースにマッチします。 (なし)
Y 4桁の10進数として完全なをパースします。 先頭のゼロは許容されますが必須ではありません。 tm_year
EY の代替表現をパースします。 例: 平成23年 tm_year
y の下2桁を10進数としてパースします。 範囲 [69,99] は1969年から1999年になり、範囲 [00,68] は 2000年から2068年になります。 tm_year
Oy 代替数値系を用いての下2桁をパースします。 例: 十一 tm_year
Ey ロケールの代替カレンダー年号 %EC からのオフセットとしてをパースします。 tm_year
C の上2桁を10進数としてパースします (範囲 [00,99])。 tm_year
EC ロケールの代替表現における年号の名前をパースします。 例: 平成 tm_year
b 完全形または省略形の月名をパースします。 例: Oct tm_mon
h b の同義語。 tm_mon
B b の同義語。 tm_mon
m を10進数としてパースします (範囲 [01,12])。 先頭のゼロは許容されますが必須ではありません。 tm_mon
Om 代替数値系を用いてをパースします。 例: 十二 tm_mon
U 週番号を10進数としてパースします (日曜日が週の最初の日です) (範囲 [00,53])。 先頭のゼロは許容されますが必須ではありません。 tm_year, tm_wday, tm_yday
OU 週番号を代替数値系を用いて %U のようにパースします。 例: 五十二 tm_year, tm_wday, tm_yday
W 週番号を10進数としてパースします (月曜日が週の最初の日です) (範囲 [00,53])。 先頭のゼロは許容されますが必須ではありません。 tm_year, tm_wday, tm_yday
OW 週番号を代替数値系を用いて %W のようにパースします。 例: 五十二 tm_year, tm_wday, tm_yday
j 通日を10進数としてパースします (範囲 [001,366])。 先頭のゼロは許容されますが必須ではありません。 tm_yday
d を10進数としてパースします (範囲 [01,31])。 先頭のゼロは許容されますが必須ではありません。 tm_mday
Od を代替数値系を用いてパースします。 例: 二十七 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 曜日を代替数値系を用いて10進数としてパースします。 日曜日が 0 です。 例: 二 tm_wday
時、分、秒
H (24時間表記) を10進数としてパースします (範囲 [00-23])。 先頭のゼロは許容されますが必須ではありません。 tm_hour
OH (24時間表記) を代替数値系を用いてパースします。 例: 十八 tm_hour
I (12時間表記) を10進数としてパースします (範囲 [01,12])。 先頭のゼロは許容されますが必須ではありません。 tm_hour
OI (12時間表記) を代替数値系を用いてパースします。 例: 六 tm_hour
M を10進数としてパースします (範囲 [00,59])。 先頭のゼロは許容されますが必須ではありません。 tm_min
OM を代替数値系を用いてパースします。 例: 二十五 tm_min
S を10進数としてパースします (範囲 [00,60])。 先頭のゼロは許容されますが必須ではありません。 tm_sec
OS を代替数値系を用いてパースします。 例: 二十四 tm_sec
その他
c ロケールの標準の日付時刻の文字列書式をパースします。 例: Sun Oct 17 04:41:13 2010 (ロケール依存) すべて
Ec ロケールの代替表現の日付時刻の文字列書式をパースします。 すべて
x ロケールの標準の日付表現をパースします。 すべて
Ex ロケールの代替日付表現をパースします。 すべて
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 などの関数で使用するためには明示的に設定する必要があります。


fmtend - 変換の書式を指定する char_type 文字のシーケンスの最後の文字の次へのポインタ
format - 変換指定子の名前の文字
modifier - % と変換指定子の間に現れるかもしれないオプショナルな修飾子

[編集] 戻り値

解析に成功した [beg, end) 内の最後の文字の次を指すイテレータ。

[編集] ノート

書式文字列内のホワイトスペースでなく '%' でない文字に対する大文字小文字を区別しない比較は、必ずではありませんが、一般的には、 str によって提供されるロケールの std::collate ファセットが使用されます。

解析エラーに遭遇した場合、この関数の多くの実装は *t にまったく触りません。

これらの関数が直接設定しない *t 内のフィールドをゼロクリアするかどうかは未規定です。 移植性のあるプログラムは get() を呼ぶ前にすべてのフィールドをゼロに初期化するべきです。

[編集]

#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
 
int main()
{
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf8"));
 
    auto& f = std::use_facet<std::time_get<char>>(std::locale("de_DE.utf8"));
    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");
        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. Unparsed string: ";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
    }
    std::cout << '\n';
}

出力:

Successfully parsed, as Sun Feb 18 23:12:34 2011 The input was fully consumed

[編集] 関連項目

(C++11)
指定された書式の日付/時刻の値をパースします
(関数テンプレート) [edit]