名前空間
変種
操作

std::get_time

From cppreference.com
< cpp‎ | io‎ | manip
 
 
 
入出力マニピュレータ
浮動小数点フォーマット
整数フォーマット
boolフォーマット
フィールド幅と埋め文字制御
その他のフォーマット
空白文字の処理
出力のフラッシュ
(C++20)  

ステータスフラグの操作
時間と通貨のI/O
(C++11)
get_time
(C++11)
(C++11)
(C++11)
クォート付きマニピュレータ
(C++14)
 
ヘッダ<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 に従って、文字入力が日付/時刻値として解析されます。結果の値は、tmb が指す std::tm オブジェクトに格納されます。

目次

[編集] パラメータ

tmb - 結果が格納される std::tm オブジェクトへの有効なポインタ
fmt - 変換フォーマットを指定するヌル終端された CharT 文字列へのポインタ

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

変換
指定子
説明 フィールドへの書き込み
% リテラルの % に一致します。完全な変換指定は %% である必要があります。 (なし)
t 任意の空白に一致します。 (なし)
n 任意の空白に一致します。 (なし)
Y 4桁の10進数としてを解析します。先頭のゼロは許可されますが、必須ではありません。 tm_year
EY を代替表現で解析します。例: 平成23年 (年 平成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 からのオフセットとしてを解析します。 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_yeartm_wdaytm_yday
OU %U による年の週を代替数値システムを使用して解析します。例: ja_JP ロケールでは 五十二 を 52 として解析します。 tm_yeartm_wdaytm_yday
W 年の週を10進数として解析します (月曜日が週の最初の曜日) (範囲 [00,53])。先頭のゼロは許可されますが、必須ではありません。 tm_yeartm_wdaytm_yday
OW %W による年の週を代替数値システムを使用して解析します。例: ja_JP ロケールでは 五十二 を 52 として解析します。 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 曜日を10進数として解析します。日曜日が 0 で、代替数値システムを使用します。例: ja_JP ロケールでは 二 を 2 として解析します。 tm_wday
時、分、秒
H を10進数として解析します。24時間クロック (範囲 [00-23])。先頭のゼロは許可されますが、必須ではありません。 tm_hour
OH 24時間クロックのを代替数値システムを使用して解析します。例: ja_JP ロケールでは 十八 を 18 として解析します。 tm_hour
I を10進数として解析します。12時間クロック (範囲 [01,12])。先頭のゼロは許可されますが、必須ではありません。 tm_hour
OI 12時間クロックのを代替数値システムを使用して解析します。例: ja_JP ロケールでは 六 を 06 として読み取ります。 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 ロケールの標準の日付と時刻の文字列フォーマットを解析します。例: Sun Oct 17 04:41:13 2010 (ロケール依存)。 すべて
Ec ロケールの代替の日付と時刻の文字列フォーマットを解析します。例: ja_JP ロケールでは 2011年 の代わりに 平成23年 (年 平成23年) を期待します。 すべて
x ロケールの標準の日付表現を解析します。 すべて
Ex ロケールの代替の日付表現を解析します。例: ja_JP ロケールでは 2011年 の代わりに 平成23年 (年 平成23年) を期待します。 すべて
X ロケールの標準の時刻表現を解析します。 すべて
EX ロケールの代替の時刻表現を解析します。 すべて
D "%m / %d / %y " に相当します。 tm_montm_mdaytm_year
r ロケールの標準の12時間クロック時刻を解析します (POSIX では "%I : %M : %S %p")。 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 のような関数で使用するには明示的に設定する必要があります。


[編集] 戻り値

未指定の型のオブジェクト。その結果、

  • もし instd::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 で指定されているように、この関数が呼び出すのは、この関数が fmt に現れる変換指定子によって直接設定されない *tmb のフィールドをゼロクリアするかどうかは未指定です。移植可能なプログラムは、std::get_time を呼び出す前に、*tmb のすべてのフィールドをゼロに初期化する必要があります。

[編集]

注: 出力を観察するには、clang または gcc >= 12.1 を選択してください。12.1 より前の libstdc++ は %b 指定子を正しく実装していません: バグ #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 オブジェクトを解析する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)