9

C++ で予定アプリケーションを開発しており、日付と時刻の機能を使用したいと考えています。

日付と時刻について話すときは文字列を使用する方が簡単ですか、それとも日付/時刻クラスを作成または取得する必要がありますか?

予定の時刻と日付の両方を保持する予定クラスをコーディングしたいと考えています。クラス ファイルをコーディングしたら、それを C++ ビルダーのフォーム アプリケーションに統合したいと考えています。

TMonthCalendar コントロールがあることがわかります。フォームアプリケーションを作成する際にこのコントロールを使用したいと考えています。では、このコントロールが使用する日付の形式は何ですか? 簡単に統合できるように、クラスを作成するときにコントロールと同じ型を使用したいと考えています。

アップデート

TDateTime 型を使用していることがわかりました。私の質問はこれです: コンソール アプリケーションでこれを使用するには、どの include ステートメントを使用する必要がありますか?

4

2 に答える 2

15

C++11 には、日付/時刻表現のための便利なデータ型と関数、およびそれらの文字列への変換が含まれています。

これにより、次のようなことができます (かなり自明だと思います)。

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    std::time_t t =  std::time(NULL);
    std::tm tm    = *std::localtime(&t);
    std::cout << "Time right now is " << std::put_time(&tm, "%c %Z") << '\n';
}

特に、データ型std::time_tとがあり、きれいに印刷するためstd::tmの非常に優れた IO マニピュレータがあります。std::put_timeそれによって使用されるフォーマット文字列は、cppreferenceで十分に文書化されています。

これは、ロケールとうまく連携することも想定されています。たとえば、日本の時刻/日付形式の場合です。

std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';

C++11 標準ライブラリに含まれるchronoライブラリを使用すると、単純な時刻/日付の計算を便利に行うこともできます。

std::chrono::time_point<std::chrono::system_clock> now;
now = std::chrono::system_clock::now();
/* The day before today: */
std::time_t now_c = std::chrono::system_clock::to_time_t(
         now - std::chrono::hours(24));

残念ながら、これらすべてがすべてのコンパイラで利用できるわけではありません。特に、このstd::put_time関数は GCC 4.7.1 ではまだ利用できないようです。最初に指定したコードを機能させるには、やや洗練されていないstd::strftime関数を使用する必要がありました。

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    std::time_t t =  std::time(NULL);
    std::tm tm    = *std::localtime(&t);

    constexpr int bufsize = 100;
    char buf[bufsize];
    if (std::strftime(buf,bufsize,"%c %Z",&tm) != 0)
      std::cout << "Time right now is " << buf << std::endl;
}
于 2012-09-10T06:43:30.737 に答える
1

日付と時刻について話すときは、文字列だけを使用する方が簡単ですか?

いいえ。会議の開始日と終了日がある場合に期間を計算するなどの単純なことでさえ、うるう年などの複雑なことを考慮する必要があります。

Date/Time クラスを作成または取得する必要がありますか?

いいえ。日付/時刻ライブラリを作成するのは簡単に思えますが、正しく行うのはかなり難しく、間違いを犯すのは非常に簡単です。また、他の人も以前にそれを行っていました-boostは、優れた評判を持つ無料のライブラリのコレクションです. 実際には他にもたくさんあるので、初心者プログラマーが日付/時刻ライブラリーを書きたがって、ひどく失敗するという決まり文句 なっています。

TMonthCalendar コントロールがあることがわかります。[...] TDateTime 型を使用していることがわかりました。

GUI フレームワークと同じ Date/Time クラスに依存することは問題ありませんが、後で GUI フレームワークを変更すると問題になる可能性があります。適切な日付/時刻ライブラリを後で別の適切な日付/時刻ライブラリと交換することはそれほど難しくないので、使いやすいと思うものを使用してください。

于 2015-10-16T15:44:55.033 に答える