Namespaces
Variants

std:: get_time

From cppreference.net
< cpp ‎ | io ‎ | manip
定義先ヘッダ <iomanip>
template < class CharT >
/*unspecified*/ get_time ( std:: tm * tmb, const CharT * fmt ) ;
(C++11以降)

式内で in >> get_time ( tmb, fmt ) が使用されると、入力ストリーム in に現在設定されているロケールの std::time_get ファセットに従い、書式文字列 fmt で指定された形式に従って文字列入力を日付/時刻値として解析します。結果の値は std::tm オブジェクト tmb が指す領域に格納されます。

目次

パラメータ

tmb - 結果が格納される std::tm オブジェクトへの有効なポインタ
fmt - pointer to a null-terminated CharT string specifying the conversion format

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

日本語訳:
変換指定子
説明 書き込み先フィールド
% リテラルの % に一致します。完全な変換指定は %% でなければなりません (なし)
t 任意の空白文字にマッチ (なし)
n 任意の空白文字にマッチ (なし)
Y 4桁の10進数として完全な year を解析します。先頭のゼロは許可されますが必須ではありません tm_year
EY 代替表現で を解析します。例:平成23年 (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 最初の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 代替数値システムを使用して 年間の週 を解析します。 %W と同様に、例えば ja_JP ロケールでは「五十二」が 52 として解析されます 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 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 代替数値システムを使用して minute を解析します。例:ja_JPロケールでは「二十五」が25として解析されます tm_min
S 秒を10進数で解析する(範囲 [00,60] )、先行ゼロは許可されるが必須ではない tm_sec
OS を代替数値システムを使用して解析します。例: 二十四はja_JPロケールで24として解析されます tm_sec
その他
c ロケールの標準的な日付と時刻の文字列形式を解析します。例: Sun Oct 17 04:41:13 2010 (ロケール依存) すべて
Ec ロケールの代替日時文字列形式を解析します。例えば、ja_JPロケールでは2011年(year 2011)の代わりに平成23年(year Heisei 23)を期待します all
x ロケールの標準日付表現を解析します all
Ex ロケールの代替日付表現を解析します。例:ja_JPロケールでは2011年(年2011)の代わりに平成23年(平成23年)を期待します all
X ロケールの標準時間表現を解析します すべて
EX ロケールの代替時間表現を解析します すべて
D equivalent to "%m / %d / %y " tm_mon , tm_mday , tm_year
r ロケールの標準12時間制時刻を解析する(POSIXでは、 "%I : %M : %S %p" tm_hour , tm_min , tm_sec
R equivalent to "%H : %M" tm_hour , tm_min
T equivalent to "%H : %M : %S" tm_hour , tm_min , tm_sec
T "%H : %M : %S" に相当 tm_hour , tm_min , tm_sec
p ロケールに対応する a.m. または p.m. を解析します tm_hour

注記: tm_isdst は書き込まれず、 mktime などの関数で使用するには明示的に設定する必要があります


戻り値

未指定の型のオブジェクトであり、以下の条件を満たすもの

  • in が型 std:: basic_istream < CharT, Traits > のオブジェクトである場合、式 in >> get_time ( tmb, fmt ) は:
    • std:: basic_istream < CharT, Traits > & を持つ
    • in を持つ
    • 関数 f ( in, tmb, fmt ) を呼び出したかのように振る舞う

関数 f が以下のように定義されている場合:

template<class CharT, class Traits>
void f(std::basic_ios<CharT, Traits>& str, std::tm* tmb, const CharT* fmt)
{
    using Iter = std::istreambuf_iterator<CharT, Traits>;
    using TimeGet = time_get<CharT, Iter>;
    std::ios_base::iostate err = std::ios_base::goodbit;
    const TimeGet& tg = std::use_facet<TimeGet>(str.getloc());
    tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
        fmt, fmt + Traits::length(fmt));
    if (err != std::ios_base::goodbit)
        str.setstate(err);
}

注記

std::time_get::do_get で規定されている通り、この関数が呼び出す処理では、 * tmb 内のフィールドのうち、 fmt に現れる変換指定子によって直接設定されないものについて、この関数がゼロクリアするかどうかは未規定です:移植性のあるプログラムでは、 std::get_time を呼び出す前に * tmb の全フィールドをゼロに初期化する必要があります。

注意: 出力を確認するには clang または gcc >= 12.1 を選択してください。12.1 より前の libstdc++ は % b 指定子を正しく実装していません: bug #78714

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
    std::tm t = {};
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf-8"));
    ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
    if (ss.fail())
        std::cout << "Parse failed\n";
    else
        std::cout << std::put_time(&t, "%c") << '\n';
}

出力例:

Sun Feb 18 23:12:34 2011

関連項目

入力文字シーケンスから時間/日付の値を std::tm に解析する
(クラステンプレート)
(C++11)
指定されたフォーマットに従って日付/時間の値をフォーマットして出力する
(関数テンプレート)
(C++20)
ストリームから chrono オブジェクトを解析する
(関数テンプレート)