タグ: 日付の並び順

  • [C++]今の日時を取得

    はじめに

     今の日付と時刻を知りたいとおもったことはありませんか。いくつか方法を記載します。
     ユーザー定義の変数名は日本語にしています。メリハリがあるとコードが読みやすいかなぁとおもったので。
     サンプルでは『using namespace std;』を省略していますので、コードを試すときはこの行をおぎなってください。

    経過秒』を time_t 形式で取得

     とりあえず time_t 形式にします。これは『1970/01/01 00:00:00 UTC からの経過秒』です。
     32ビットシステムでは 2038/01/19 03:14:07 まで表現できるそうです。もうすぐトラブルが発生しそうな予感がしますね。64ビットシステムへの移行が必要です。

    now()を使う方法

    #include <chrono>
    chrono::system_clock::time_point 日時 = chrono::system_clock::now();
    time_t 経過秒 = chrono::system_clock::to_time_t(日時);

    time(nullptr)を使う方法

    #include <chrono>
    time_t 経過秒 = time(nullptr);

     『nullptr』を使うことが推奨されているようですが、かわりに『NULL』や『0』を使うこともできます。

    構造体 tm 形式へ変換

     先ほど求めた経過秒(time_t)を今の日時 (struct tm) にします。今の日時といっても色々ありますが、協定世界時 (UTC,GMT) へ変換するものと、現地時間(ローカルタイム)へ変換するものを記載します。

    協定世界時へ

    struct tm 今の日時;
    gmtime_s(&今の日時, &経過秒);

    現地時間(日本時間)へ

    struct tm 今の日時;
    localtime_s(&今の日時, &経過秒);

    今の日時 (struct tm) を文字の日時 (char[])へ

     今の日時を文字として整形してみましょう。日付の文字列は国によって異なりますが、今回は日本の形式にします。
     ・日本 : //日
     ・イギリス : 日//
     ・アメリカ : /日/
     国によって日付の並び順が異なりますが、何だか話す順番に通じるものがあるような気がします。

    char型の『年/月/日 時:分:秒』へ

    char 文字の日時[128];
    strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);

     char[128] では sizeof(char[128]) が128になります。strftime(文字の日時, sizeof(文字の日時), … としても大丈夫そうです。

    wchar_t型の『年/月/日 時:分:秒』へ

    wchar_t 文字の日時[128];
    wcsftime(文字の日時, 128, L"%Y/%m/%d %H:%M:%S", &今の日時);

     wchar_t[128] では sizeof(wchar_t[128]) が 256 になります。wcsftime(文字の日時, sizeof(文字の日時), … とはできませんね。

    さいごに

     コード全体を書いてみましょう。

    #include <chrono>
    using namespace std;
    time_t 経過秒 = time(nullptr);
    struct tm 今の日時;
    localtime_s(&今の日時, &経過秒);
    char 文字の日時[128];
    strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);
    cout << "今は " << 文字の日時 << endl;