名前空間
変種
操作

std::chrono::parse

From cppreference.com
< cpp‎ | chrono
 
 
 
ヘッダー <chrono> で定義
template< class CharT, class Parsable >
/* unspecified */ parse( const CharT* fmt, Parsable& tp );
(1) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,

                         Parsable& tp );
(2) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const CharT* fmt, Parsable& tp,

                         std::basic_string<CharT, Traits, Alloc>& abbrev );
(3) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
                         Parsable& tp,

                         std::basic_string<CharT, Traits, Alloc>& abbrev );
(4) (C++20以降)
template< class CharT, class Parsable >

/* unspecified */ parse( const CharT* fmt, Parsable& tp,

                         std::chrono::minutes& offset );
(5) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,

                         Parsable& tp, std::chrono::minutes& offset );
(6) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const CharT* fmt, Parsable& tp,
                         std::basic_string<CharT, Traits, Alloc>& abbrev,

                         std::chrono::minutes& offset );
(7) (C++20以降)
template< class CharT, class Traits, class Alloc, class Parsable >

/* unspecified */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt,
                         Parsable& tp,
                         std::basic_string<CharT, Traits, Alloc>& abbrev,

                         std::chrono::minutes& offset );
(8) (C++20以降)

返されるオブジェクトmanipは、指定されていない型であり、`is`という名前の`std::basic_istream<CharT, Traits>`オブジェクトが与えられた場合、式is >> manipは、次のようにfrom_stream(引数依存の検索を有効にするために、非修飾で呼び出されます)を呼び出します。

1) from_stream(is, fmt, tp)
2) from_stream(is, fmt.c_str(), tp)
3) from_stream(is, fmt, tp, std::addressof(abbrev))
4) from_stream(is, fmt.c_str(), tp, std::addressof(abbrev))
5) from_stream(is, fmt, tp,
            static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
6) from_stream(is, fmt.c_str(), tp,
            static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
7) from_stream(is, fmt, tp, std::addressof(abbrev), &offset)
8) from_stream(is, fmt.c_str(), tp, std::addressof(abbrev), &offset)

is >> manip は、is の値を持つ `std::basic_istream<CharT, Traits>` 型の左辺値です。

これらのオーバーロードは、対応する from_stream 式が正常に形成されている場合にのみ、オーバーロード解決に参加します。

実装は、フォーマット文字列への無効な参照の使用を困難にすることを推奨します。例えば、戻り値の型を移動不可にし、operator>> が戻り値の型の左辺値を受け付けないようにするなどです。

目次

[編集] パラメータ

fmt - フォーマット文字列(下記参照)
tp - 解析結果を保持するオブジェクト
abbrev - %Z 指定子に対応するタイムゾーンの省略形または名前を保持する文字列
offset - %z 指定子に対応する UTC からのオフセットを表す期間

[編集] フォーマット文字列

フォーマット文字列は、0個以上の変換指定子と通常の文字で構成されます。空白文字と終端のヌル文字を除く各通常の文字は、入力ストリームの同一の文字1つと一致するか、ストリームの次の文字が一致しない場合は関数が失敗します。

各空白文字は、入力ストリームの0個以上の空白文字と一致します。

各未変更の変換指定子は、% 文字で始まり、その後に指定子の動作を決定する文字が続きます。一部の変換指定子には、% 文字の後に E または O 修飾子文字が挿入される変更形式があります。一部の変換指定子には、% 文字の後に正の10進数整数(以下、N と表示)で与えられる幅パラメータが挿入される変更形式があります。各変換指定子は、一致した文字を以下の表に従って日付および時刻の型の一部として解釈します。

% で始まり、以下の変換指定子のいずれにも一致しないフォーマット文字列内の文字シーケンスは、通常の文字として解釈されます。

from_stream がフォーマット文字列で指定されたすべてを解析できなかった場合、または完全な結果を指定するのに十分な情報が解析されなかった場合、または解析によって矛盾する情報が明らかにされた場合、is.setstate(std::ios_base::failbit) が呼び出されます。

以下の変換指定子が利用可能です。

変換
指定子
説明
%% リテラルの % 文字に一致します。
%n 1つの空白文字に一致します。
%t 0個または1個の空白文字に一致します。
%C
%NC
%EC
世紀を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %EC は、ロケールの世紀の代替表現を解釈します。

%y
%Ny
%Ey
%Oy
年の下2桁を10進数として解析します。世紀が他に指定されていない場合(例: %C)、範囲 [69, 99] の値は1969年から1999年、範囲 [00, 68] の値は2000年から2068年と推定されます。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %Ey および %Oy は、ロケールの代替表現を解釈します。

%Y
%NY
%EY
年を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 4 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %EY は、ロケールの代替表現を解釈します。

%b
%B
%h
ロケールの完全または省略形の、大文字小文字を区別しない月名を解析します。
%m
%Nm
%Om
月を10進数として解析します(1月は 1)。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %Om は、ロケールの代替表現を解釈します。

%d
%Nd
%Od
%e
%Ne
%Oe
月の日を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %Od および %Oe は、ロケールの代替表現を解釈します。

曜日
%a
%A
ロケールの完全または省略形の、大文字小文字を区別しない曜日の名前を解析します。
%u
%Nu
ISO曜日を10進数(1〜7)として解析します。月曜日が 1 です。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 1 です。先頭のゼロは許可されますが、必須ではありません。
%w
%Nw
%Ow
曜日を10進数(0〜6)として解析します。日曜日が 0 です。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 1 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %Ow は、ロケールの代替表現を解釈します。

ISO 8601週番号ベースの年

ISO 8601では、週は月曜日から始まり、その年の最初の週は次の要件を満たす必要があります。

  • 1月4日を含む
  • その年の最初の木曜日を含む
%g
%Ng
ISO 8601週番号ベースの年の下2桁を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。
%G
%NG
ISO 8601週番号ベースの年を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 4 です。先頭のゼロは許可されますが、必須ではありません。
%V
%NV
ISO 8601年の週番号を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。
週/年の日
%j
%Nj
年の日を10進数として解析します(1月1日は 1)。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 3 です。先頭のゼロは許可されますが、必須ではありません。
%U
%NU
%OU
年の週番号を10進数として解析します。その年の最初の日曜日は週 01 の最初の日です。それ以前の同じ年の日数は週 00 に含まれます。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OU は、ロケールの代替表現を解釈します。

%W
%NW
%OW
年の週番号を10進数として解析します。その年の最初月曜日は週 01 の最初の日です。それ以前の同じ年の日数は週 00 に含まれます。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OW は、ロケールの代替表現を解釈します。

日付
%D "%m/%d/%y" と同等です。
%F
%NF
"%Y-%m-%d" と同等です。幅が指定されている場合、それは %Y にのみ適用されます。
%x
%Ex
ロケールの日付表現を解析します。

変更されたコマンド %Ex は、ロケールの代替日付表現を解釈します。

時刻
%H
%NH
%OH
時間(24時間制)を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OH は、ロケールの代替表現を解釈します。

%I
%NI
%OI
時間(12時間制)を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OI は、ロケールの代替表現を解釈します。

%M
%NM
%OM
分を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OM は、ロケールの代替表現を解釈します。

%S
%NS
%OS
秒を10進数として解析します。幅 N は読み取る最大文字数を指定します。デフォルトの幅は 2 です。先頭のゼロは許可されますが、必須ではありません。

変更されたコマンド %OS は、ロケールの代替表現を解釈します。

%p 12時間制に関連付けられた午前/午後指定子のロケールでの等価なものを解析します。
%R "%H:%M" と同等です。
%T "%H:%M:%S" と同等です。
%r ロケールの12時間制時刻を解析します。
%X
%EX
ロケールの時刻表現を解析します。

変更されたコマンド %EX は、ロケールの代替時刻表現を解釈します。

その他
%c
%Ec
ロケールの日付と時刻の表現を解析します。

変更されたコマンド %Ec は、ロケールの代替日付と時刻の表現を解釈します。

%z
%Ez
%Oz
[+|-]hh[mm] の形式で UTC からのオフセットを解析します。例えば、-0430 は UTC より4時間30分遅れていることを指し、04 は UTC より4時間進んでいることを指します。

変更されたコマンド %Ez および %Oz は、[+|-]h[h][:mm] の形式を解析します(つまり、時間と分の間に : が必要であり、時間の先頭のゼロを省略可能にします)。

%Z タイムゾーンの省略形または名前を解析します。これは、A から Za から z0 から 9-+_、および / の文字のみを含む最長の文字シーケンスとして取得されます。

[編集]

#include <chrono>
#include <iostream>
#include <locale>
#include <sstream>
 
int main()
{
    auto parse = [&](auto str, auto fmt, auto o)
    {
        std::istringstream is{str};
        is.imbue(std::locale("en_US.utf-8"));
        is >> std::chrono::parse(fmt, o);
        is.fail() ? std::cout << "Parse failed!\n" : std::cout << o << '\n';
    };
    parse("01:02:03", "%H:%M:%S", std::chrono::hours{});
    parse("01:02:03", "%H:%M:%S", std::chrono::minutes{});
    parse("01:02:03", "%H:%M:%S", std::chrono::seconds{});
}

実行結果の例

1h
62min
3723s

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3554 C++20 プレーンなヌル終端文字型シーケンスのオーバーロードが欠落していた 追加された

[編集] 関連項目

指定された書式に従ってストリームから sys_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから utc_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから tai_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから gps_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから file_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから local_time を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから year を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから month を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから day を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから weekday を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから month_day を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから year_month を解析する
(関数テンプレート) [edit]
指定された書式に従ってストリームから year_month_day を解析する
(関数テンプレート) [edit]
(C++11)
指定されたフォーマットの日付/時刻の値を構文解析する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)