日付時刻とタイムゾーンの取得の仕方(std::chrono使用)

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

以前の記事で、システム時刻の取得と、それをタイムゾーンに合わせて出力する方法を調べた。

今どきは、それをもっとかっこよくやれるらしい。試してみる。

前提

C++20を使用。

ためした

std::chronoを使う。

#include <Windows.h>
#include <iostream>
#include <chrono>
#include <format>

// C++20以降でないと動きません

int main()
{
    while (true)
    {
        // 現在システム時刻(ミリ秒まで)
        auto nowWithMs = std::chrono::system_clock::now();

        // 現在システム時刻(秒まで)
        auto nowWithoutMs = std::chrono::floor<std::chrono::seconds>(nowWithMs);
        
        // 現在システム時刻(ミリ秒まで&タイムゾーン考慮)
        std::chrono::zoned_time nowZoned { std::chrono::current_zone(), std::chrono::system_clock::now() };

        // 現在システム時刻(ミリ秒まで&タイムゾーン考慮)
        std::chrono::zoned_time nowZonedAsia { std::chrono::locate_zone("Asia/Tokyo"), std::chrono::system_clock::now() };

        // -----------------------------------------------------------------

        std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", nowWithoutMs);   // 2024/09/12 13:02:38
        std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", nowWithMs);      // 2024/09/12 13:02:38.2312928
        std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", nowZoned);       // 2024/09/12 22:02:38.2595743
        std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", nowZonedAsia);   // 2024/09/12 22:02:38.2595743

        Sleep(1050);
    }
}

参考

以前の記事
日付時刻とタイムゾーンの取得の仕方

https://qiita.com/tera1707/items/e3ee39a6bb0e7742381e

std::chrono

https://cpprefjp.github.io/reference/chrono.html

std::format

https://cpprefjp.github.io/reference/format/format.html

https://cpprefjp.github.io/reference/chrono/format.html

タイムゾーン考慮

https://www.techiedelight.com/ja/get-current-time-and-date-in-cpp/