5

これは恥ずかしいですが、日時の単純な操作を行うのに苦労しています。

これは、私が基本的に c++11 を使用して達成しようとしているものの c# バージョンです。

DateTime date1=new DateTime(4,5,2012);
DateTime date2=new DateTIme(7,8,2013);
int day1=date1.Days;
TimeSpan ts=d2-d1;
int diffDays=ts.Days;

私は何を試しましたか?

    std::tm tm;
    tm.tm_year=113;
    tm.tm_mon=0;
    tm.tm_wday=0;

    std::time_t tt=mktime(&tm);
    std::chrono::system_clock::time_point then = std::chrono::system_clock::from_time_t(tt);
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    auto e1 = std::chrono::duration_cast<std::chrono::hours>(now - then).count();

e1 (379218) の値はまったく意味がありません。

datetime の C++11 標準ライブラリとして提示されている chrono を調べましたが、int year=2012、int month=2、int day=14 の日付を作成する方法の例が見つかりませんでした。

PS: c++11 で日付/時刻/タイムゾーンを処理するには chrono で十分ですか? time.h は必要ですか?

4

2 に答える 2

7

古い質問に対する新しい回答。

古風な をいじる以外は、C++11 には、ブースト Date Timestd::tmを除いて、日付または日時を処理する適切な方法がありません。そして、私が最近取り組んでいるライブラリがもう 1 つあります。これは、パフォーマンス、コンパイル時の型の安全性、および互換性に大きく傾いています。提示されているように、C++14 でのみ動作しますが、s の一部を取り消すと、C++11 で動作します。これはヘッダーのみで、1 つのヘッダーのみで構成され、ここに文書化されています。 chronoconstexprI/O 機能は軽めです。(そして現在、広範な I/O 機能を備えています)

しかし、あなたの例では次のようになります。

DateTime(4,5,2012)ああ、よく見てみると、C# を知らないので、2012 年 4 月 5 日を指すのか、2012 年 5 月 4 日を指すのかわかりません。m/d/y と d/m/y の両方の形式が広く使用されています。これは、私のライブラリが対処する問題の 1 つです。両方の形式を明確に受け入れます。このデモでは、m/d/y 形式で書いていると仮定します。ただし、両方の形式を使用して例を再現します。

#include "date.h"
#include <iostream>

int
main()
{
//     DateTime date1=new DateTime(4,5,2012);
//     DateTime date2=new DateTIme(7,8,2013);
//     int day1=date1.Days;
//     TimeSpan ts=d2-d1;
//     int diffDays=ts.Days;

    using namespace date;
    auto date1 = sys_days(apr/5/2012);     // m/d/y is ok
    auto date2 = sys_days(8_d/jul/2013);   // d/m/y is ok
                                           // y/m/d is also ok
    auto diffDays = date2 - date1;         // diffDays is a chrono::duration
    std::cout << diffDays.count() << '\n';
}

これは出力されます:

459

C++14 では、この計算は実際にはコンパイル時に実行できます。

constexpr auto date1 = sys_days(apr/5/2012);
constexpr auto date2 = sys_days(8_d/jul/2013);
constexpr auto diffDays = date2 - date1;
static_assert(diffDays == days{459}, "");

つまり、「日付定数」は非常に読みやすく、非常に効率的であり、「即時ロード」にコンパイルできます。

完全な説明、チュートリアル、および実装については、ドキュメントを参照してください。

于 2015-03-27T01:55:07.430 に答える