次の方法で共有


zoned_traits 構造体

zoned_time と異なる既定のタイム ゾーンを関連付けることができます。また、必要に応じてカスタム名をタイム ゾーンにマップすることもできます。

構文

1)
template<class T>
struct zoned_traits {}; // C++20

2)
template <>
struct zoned_traits<const time_zone*>; // C++20

パラメーター

1) T: カスタム time_zone を提供する型へのポインター。
2) time_zone* テンプレート引数を指定しない場合、この特殊化によって const std::chrono::time_zone* が提供されます。これは、既定では UTC タイム ゾーンです。

解説

指定した型へのポインターでは、静的関数 default_zone() または locate_zone() を提供する必要はありません。 ただし、そうしない場合、zoned_time コンストラクターはオーバーロードの解決時に考慮されません。

メンバー

名前 説明
default_zone 既定のタイム ゾーンの time_zone ポインターを取得します。
locate_zone 指定したタイム ゾーンの time_zone ポインターを取得します。

要件

ヘッダー: <chrono>

名前空間: std::chrono

コンパイラ オプション: /std:c++latest

Microsoft C++ では、Visual Studio 2019 バージョン 16.10 以降の zoned_traits クラスがサポートされています。

タイム ゾーン データは、Windows 10 バージョン 1903/19H1 以降および Windows Server 2022 以降でのみ使用できます。

default_zone

既定のタイム ゾーンの time_zone を取得します。 このしくみの詳細については、このトピックの最後にあるコードを参照してください。

static const time_zone* default_zone();

戻り値

テンプレート引数が指定されていない場合、テンプレートの特殊化によって、UTC タイム ゾーンを返す zoned_traits<const time_zone*> が提供されます。 それ以外の場合は、テンプレート引数 T によって提供される既定のタイム ゾーンを返します。

locate_zone

指定されたタイム ゾーンの time_zone ポインターを返します。 このしくみの詳細については、このトピックの最後にあるコードを参照してください。

static const time_zone* locate_zone(string_view name);

テンプレート パラメーター

name
検索するタイム ゾーンの名前。 たとえば、"UTC" のようにします。

戻り値

カスタム タイム ゾーン ポインターのテンプレート引数を指定せずに zoned_traits を構築した場合、戻り値は std::chrono::locate_zone(name) になります。 それ以外の場合は、テンプレート引数 T で定義されている locate_zone() の値を返します。

例: zoned_traits

次の例では、zoned_traits を使用して、カスタムの既定のタイム ゾーンを指定する方法を示します。

まず、CustomTimeZonePtr を定義します。これは、operator->() を介してカスタム タイム ゾーン型へのポインターを提供します。

次に、zoned_traits が宣言され、この中で、default_zone が、カスタムの既定のタイム ゾーンを返すように定義されます。 この場合、南極です。

この例では、zoned_traits<CustomTimeZonePtr>::locate_zone() は指定されたタイム ゾーン名を std::chrono::locate_zone() に渡します。 この関数では、カスタム タイム ゾーン名を別のタイム ゾーンにマップできます。

最後に、stdZT が定義されます。これは、標準 time_zone ポインターを使用します。これは、テンプレート引数を提供しないため、const std::chrono::time_zone* が提供する特殊化が使用されるためです。

この例を実行して、zoned_time がカスタムを使用し、標準の time_zone ポインターを使用することを確認します。

// compile using: /std:c++latest
#include <iostream>
#include <chrono>

using namespace std::chrono;

struct CustomTimeZonePtr
{
    CustomTimeZonePtr() {}
    CustomTimeZonePtr(const time_zone* tz) : tzptr(tz) {}

    const time_zone* operator->() const
    {
        return tzptr;
    }

private:
    const time_zone* tzptr;
};

template <>
struct zoned_traits<CustomTimeZonePtr>
{
    static const CustomTimeZonePtr default_zone()
    {
        return CustomTimeZonePtr{ locate_zone("Antarctica/South_Pole") };
    }

    static const CustomTimeZonePtr locate_zone(std::string_view name)
    {
        // Here you can provide your own mapping between the name
        // parameter and another time zone before passing it to locate_zone()
        return CustomTimeZonePtr{ std::chrono::locate_zone(name) };
    }
};

int main()
{
    std::cout << "-- Custom time zone pointer with specialized zoned_traits and different default zone behavior --\n";
    zoned_time<seconds, CustomTimeZonePtr> myZT;
    std::cout << myZT.get_info() << "\n";

    std::cout << "-- Built-in time zone pointer with standard zoned_traits --\n";
    zoned_time<seconds, const time_zone*> stdZT;
    std::cout << stdZT.get_info() << "\n";

    return 0;
}
-- Custom time zone pointer with specialized zoned_traits and different default zone behavior --
begin: 1945-12-31 12:00:00, end: 1974-11-02 14:00:00, offset: 43200s, save: 0min, abbrev: GMT+12
-- Built-in time zone pointer with standard zoned_traits --
begin: -32767-01-01 00:00:00, end: 32767-12-31 23:59:59, offset: 0s, save: 0min, abbrev: UTC

関連項目

<chrono>
time_zone
zoned_time クラス
ヘッダー ファイル リファレンス