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