名前空間
変種
操作

std::formatter<std::chrono::zoned_time>, std::chrono::local_time_format

From cppreference.com
< cpp‎ | chrono‎ | zoned time
 
 
 
 
ヘッダー <chrono> で定義
template< class Duration, class TimeZonePtr, class CharT >

struct formatter<std::chrono::zoned_time<Duration, TimeZonePtr>, CharT>
    : std::formatter</*ローカル時間フォーマット型*/
                         <std::common_type_t<Duration,

                                             std::chrono::seconds>>, CharT>
(1) (C++20以降)
template< class Duration >

/*ローカル時間フォーマット型*/<Duration>
    local_time_format( const std::chrono::local_time<Duration>& tp,
                       const std::string* abbrev = nullptr,

                       const std::chrono::seconds* offset_sec = nullptr );
(2) (C++20以降)
ヘルパーテンプレート
template< class Duration >

struct /*ローカル時間フォーマット型*/
{
    std::chrono::local_time<Duration> /*時間*/;
    const std::string* /*略称*/;
    const std::chrono::seconds* /*オフセット秒*/;

};
(3) (C++20以降)
(説明用*)
template< class Duration, class CharT >
struct formatter</*ローカル時間フォーマット型*/<Duration>, CharT>;
(4) (C++20以降)
1) std::formatter の特殊化で、 std::chrono::zoned_time のフォーマット規則を定義します。
  • parse メンバは基底クラスから継承されます。
  • フォーマット引数を tp、フォーマットコンテキストを ctx とすると、format メンバの動作は以下と同等です。

using common_duration_type = std::common_type_t<Duration, std::chrono::seconds>;
using formatter_type = std::formatter<ローカル時間フォーマット型 <common_duration_type>;

std::chrono::sys_info info = tp.get_info();
return formatter_type::format({tp.get_local_time(), &info.abbrev, &info.offset_sec}), ctx);

2) std::chrono::zoned_time としてフォーマット可能なオブジェクトを作成します。
{time, abbrev, offset_sec} を返します。
3) std::chrono::zoned_time のフォーマットに必要なすべての情報を含む、公開専用型。
  • abbrev はタイムゾーンの略称を含みます。
  • offset_sec は UTC からのオフセットを含みます。
  • time はその他必要な情報を含みます。
4) std::formatter の特殊化で、 std::chrono::zoned_time の基底となるフォーマット規則を定義します。
フォーマット引数を f とすると、この特殊化は以下の追加フォーマット規則を持ちます。
  • chrono-spec が省略された場合、結果は chrono-spec として %F %T %Z を使用するのと同等です。
  • %Z が使用された場合、 f.abbrev がヌルポインタでない場合は *f.abbrev に置換されます。それ以外の場合は、std::format_error 型の例外がスローされます。
  • %z または %z の修飾バリアントが使用された場合、 f.offset_sec がヌルポインタでない場合は *f.offset_sec に置換されます。それ以外の場合は、std::format_error 型の例外がスローされます。

std::formatter の特殊化は、通常直接アクセスされることはなく、フォーマット関数を通じて使用されます。

目次

[編集] フォーマット指定子

フォーマット指定子は次の形式をとります。

fill-and-align (optional) width (optional) precision (optional) L(optional) chrono-spec (optional)

fill-and-alignwidthprecision は、標準フォーマット指定子と同じ意味を持ちます。precision は、表現型 Rep が浮動小数点型である std::chrono::duration 型でのみ有効です。それ以外の場合は、std::format_error がスローされます。

フォーマットに使用されるロケールは次のように決定されます。

  • フォーマット指定子に L が存在しない場合は、デフォルトの "C" ロケール。
  • それ以外の場合は、フォーマット関数に渡された std::locale オブジェクトで示されるロケール(存在する場合)。
  • それ以外の場合(L が存在し、フォーマット関数に std::locale が渡されなかった場合)、グローバルロケール。

(通常のまたはワイドな)文字列リテラルのエンコーディングが Unicode エンコーディング形式であり、ロケールが実装定義されたロケールのセットに含まれている場合、ロケールに依存する各置換は、置換文字シーケンスがリテラルエンコーディングに変換されたかのように実行されます。

chrono-spec は、1つ以上の変換指定子と、通常の文字({}% 以外)で構成されます。chrono-spec は変換指定子で始まる必要があります。すべての通常の文字は変更なしに出力に書き込まれます。変更されない各変換指定子は、% 文字とその後の指定子の動作を決定する文字で始まります。一部の変換指定子には、% 文字の後に E または O 修飾子文字が挿入された変更形式があります。各変換指定子は、以下に説明するように、出力で適切な文字に置き換えられます。

特に指定がない限り、 chrono-spec が空の場合、chrono オブジェクトは、フォーマットロケール(std::locale::classic()、渡された std::locale オブジェクト、および std::locale::global() のいずれか)で imbue された std::basic_ostringstream<CharT> 型のオブジェクト osストリーミング してから、フォーマット指定子に従って追加のパディングと調整を行った上で os.str() を出力バッファにコピーするのと同等にフォーマットされます。

以下のフォーマット指定子が利用可能です

変換
指定子
説明
%% リテラルの % 文字を書き込みます。
%n 改行文字を書き込みます。
%t 水平タブ文字を書き込みます。
%C
%EC
切り捨て除算を使用して、年を 100 で割った値を書き込みます。結果が 1 桁の 10 進数である場合、先頭に 0 が付きます。

修飾コマンド %EC は、世紀のロケールでの代替表現を書き込みます。

%y
%Oy
%Ey
年の下 2 桁を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %Oy は、ロケールでの代替表現を書き込みます。

修飾コマンド %Ey は、%EC(年のみ)からのオフセットのロケールでの代替表現を書き込みます。

%Y
%EY
年を 10 進数で書き込みます。結果が 4 桁未満の場合、先頭に 0 を付けて 4 桁になります。

修飾コマンド %EY は、ロケールでの完全な年の代替表現を書き込みます。

%b
%h
ロケールでの省略された月名を書き込みます。
%B ロケールでの完全な月名を書き込みます。
%m
%Om
月を 10 進数で書き込みます(1 月は 01)。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %Om は、ロケールでの代替表現を書き込みます。

%d
%Od
月の日を 10 進数で書き込みます。結果が 1 桁の 10 進数である場合、先頭に 0 が付きます。

修飾コマンド %Od は、ロケールの代替表現を書き込みます。

%e
%Oe
月の日を 10 進数で書き込みます。結果が 1 桁の 10 進数である場合、先頭にスペースが付きます。

修飾コマンド %Oe は、ロケールの代替表現を書き込みます。

曜日
%a ロケールでの省略された曜名を書き込みます。
%A ロケールでの完全な曜名を書き込みます。
%u
%Ou
ISO 曜数を 10 進数(1-7)で書き込みます。月曜日が 1 です。

修飾コマンド %Ou は、ロケールでの代替表現を書き込みます。

%w
%Ow
曜数を 10 進数(0-6)で書き込みます。日曜日が 0 です。

修飾コマンド %Ow は、ロケールでの代替表現を書き込みます。

ISO 8601週番号ベースの年

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

  • 1月4日を含む
  • その年の最初の木曜日を含む
%g ISO 8601 週番号の年の下 2 桁を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。
%G ISO 8601 週番号の年を 10 進数で書き込みます。結果が 4 桁未満の場合、先頭に 0 を付けて 4 桁になります。
%V
%OV
ISO 8601 週番号を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OV は、ロケールでの代替表現を書き込みます。

週/年の日
%j 年の日を 10 進数で書き込みます(1 月 1 日は 001)。結果が 3 桁未満の場合、先頭に 0 を付けて 3 桁になります。
%U
%OU
週番号を 10 進数で書き込みます。その年の最初の日曜日は週 01 の最初の日です。それより前の同じ年の日は週 00 に含まれます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OU は、ロケールでの代替表現を書き込みます。

%W
%OW
週番号を 10 進数で書き込みます。その年の最初(月曜日)は週 01 の最初の日です。それより前の同じ年の日は週 00 に含まれます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OW は、ロケールでの代替表現を書き込みます。

日付
%D "%m/%d/%y" と同等です。
%F "%Y-%m-%d" と同等です。
%x
%Ex
ロケールでの日付表現を書き込みます。

修飾コマンド %Ex は、ロケールでの代替日付表現を生成します。

時刻
%H
%OH
時間(24 時間制)を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OH は、ロケールでの代替表現を書き込みます。

%I
%OI
時間(12 時間制)を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OI は、ロケールでの代替表現を書き込みます。

%M
%OM
分を 10 進数で書き込みます。結果が 1 桁の場合、先頭に 0 が付きます。

修飾コマンド %OM は、ロケールでの代替表現を書き込みます。

%S
%OS
秒を 10 進数で書き込みます。秒数が 10 未満の場合、結果は 0 でパディングされます。

入力の精度が秒で正確に表現できない場合、フォーマットは固定形式の 10 進浮動小数点数になり、精度は入力の精度に一致します(または、10 進浮動小数点秒への変換が 18 桁の小数点以下の桁数内で行えない場合はマイクロ秒の精度に一致します)。小数点文字はロケールに応じてローカライズされます。

修飾コマンド %OS は、ロケールでの代替表現を書き込みます。

%p 12 時間制に関連付けられた、ロケールでの AM/PM 指定を書き込みます。
%R "%H:%M" と同等です。
%T "%H:%M:%S" と同等です。
%r ロケールでの 12 時間制の時刻を書き込みます。
%X
%EX
ロケールでの時刻表現を書き込みます。

修飾コマンド %EX は、ロケールでの代替時刻表現を書き込みます。


タイムゾーン
%z
%Ez
%Oz
ISO 8601 形式の UTC からのオフセットを書き込みます。例: -0430 は UTC より 4 時間 30 分遅れていることを示します。オフセットがゼロの場合は +0000 が使用されます。

修飾コマンド %Ez および %Oz は、時間と分の間に : を挿入します(例: -04:30)。

%Z タイムゾーンの省略名を書き込みます。
その他
%c
%Ec
ロケールでの日付と時刻の表現を書き込みます。

修飾コマンド %Ec は、ロケールでの代替日付と時刻の表現を書き込みます。

次の指定子は認識されますが、std::format_error がスローされます。

変換
指定子
説明
期間のカウント
%Q 期間のティック数を書き込みます。つまり、count() を通じて取得される値です。
%q 期間の単位接尾辞を書き込みます。operator<<() で指定されたとおりです。

[編集]

[編集] 不具合報告

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

DR 適用対象 公開された動作 正しい動作
LWG 4124 C++20 1. chrono-spec は省略できませんでした。
2. `zoned_time` はフォーマットできませんでした。
    秒より粗い分解能で。
1. 省略可能です。
2. フォーマット可能です。
    これらの分解能で。
P2372R3 C++20 formatter はグローバルロケールまたは渡されたロケールを使用します。 L がない場合、デフォルトの "C" ロケールが使用されます。

[編集] 関連項目

(C++20)
引数のフォーマット済み表現を新しい文字列に格納する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)