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 文字列へのポインタ
書式文字列はゼロ個以上の変換指定子、ホワイトスペース、および (% を除く) 通常の文字から構成されます。 それぞれの通常の文字は、入力ストリーム中の同じ文字に、大文字小文字を区別して、マッチすることが期待されます。 それぞれのホワイトスペース文字は、入力文字列中の任意のホワイトスペース文字にマッチします。 それぞれの変換指定は % で始まり、オプションで 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 などの関数で使用するためには明示的に設定する必要があります。
|
[編集] 戻り値
in
が std::basic_istream<CharT, Traits> 型の入力ストリームの名前である場合に式 in >> get_time(tmb, fmt) が以下のコードが実行されたかのように動作するような、未規定な型のオブジェクトを返します。
typedef std::istreambuf_iterator<CharT, Traits> Iter;
typedef std::time_get<CharT, Iter> TimeGet;
std::ios_base::iostate err = std::ios_base::goodbit;
const TimeGet& tg = std::use_facet<TimeGet>(in.getloc());
tg.get(Iter(in.rdbuf()), Iter(), in, err, tmb, fmt, fmt + traits::length(fmt));
if (err != std::ios_base::goodbit)
in.setstate(err);
[編集] ノート
この関数が呼ぶ std::time_get::do_get で規定されているように、 fmt に現れる変換指定子によって直接設定されない *tmb のフィールドがゼロクリアされるかどうかは未規定です。 移植性のあるプログラムは std::get_time
を呼ぶ前に *tmb のすべてのフィールドをゼロに初期化するべきです。
ノート: 出力を観察するには clang を選択してください。 libstdc++ は %b 指定子を正しく実装していません。 bug 78714
#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
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';
}
}
出力例:
[編集] 関連項目
|
入力文字シーケンスから時刻/日付の値をパースして struct std::tm に変換します (クラステンプレート) [edit]
|
|
指定された書式に従って日付/時刻の値をフォーマットして出力します (関数テンプレート) [edit]
|