2017-01-20 4 views
1

C++の日付と日、月、年の変数を持つ の日付を比較するにはどうすればいいですか?すなわち、イベントから30日が経過したことを確認する方法に。私は個人的には、同じ年に2つの日付を比較すると、年のすべての月の日数を保持し、日付を日に変換して、必要な計算を行う配列を使用して、両方の日付を「日 - 日付」にします。日付を比較する簡単な方法はありますか?C++で日付を比較する方法

+0

['std :: tie'](http://en.cppreference.com/w/cpp/utility/tuple/tie)は役に立ちます – NathanOliver

+0

期間を確認している場合は、単一の日付番号に変換されます。おそらく最も人気が高いのは、1970年1月1日からの経過秒数である[Unix time](https://en.wikipedia.org/wiki/Unix_time)です。利用可能なライブラリが何をサポートしているかを知りたいかもしれません。 –

+2

あなたはどの日時ライブラリを使用していますか?あなたは解決策を研究しましたか? –

答えて

3

ここには非常に良いC++11/14 library for handling dates です。それは{year, month, day}構造(date::year_month_dayと呼ばれる)と{count-of-days}構造(sys_daysと呼ばれる)を持つことができます。また、これら2つの構造間の変換を簡単かつ効率的に行うことができます。当然、比較演算子があります。

ライブラリ全体は基本的に<chrono>のカレンダータイプの拡張です。

ビデオの導入は、こちらをご覧ください:

https://www.youtube.com/watch?v=tzyGjOm8AKo

Lots of example code hereを。ここ

{year, month, day}構造と{count-of-days}構造との間で変換するための基礎となるアルゴリズムの詳細な説明である:

http://howardhinnant.github.io/date_algorithms.html

ここフィールド(year_month_day)とシリアルの両方のためのいくつかの日付の作成及び比較例は、(ありますsys_days)データ構造:

#include "date.h" 

int 
main() 
{ 
    using namespace date::literals; 

    // create and compare {year, month, day} structures 
    constexpr auto ymd1 = 2017_y/jan/21; 
    constexpr auto ymd2 = ymd1 + date::months{15}; 
    static_assert(ymd2 > ymd1, "ymd2 is 15 months after ymd1"); 
    static_assert(ymd2 == 2018_y/apr/21, "ymd2 is 2018-04-21"); 

    // create and compare {count_of_days} structures 
    constexpr date::sys_days sd2 = ymd2; 
    static_assert(sd2 == ymd2, "sd2 is the same day as ymd2"); 
    static_assert(sd2.time_since_epoch().count() == 17642, "sd2 is day 17642"); 
    constexpr date::sys_days sd1 = sd2 - date::days{465}; 
    static_assert(sd1 < sd2, "sd1 is 465 days before sd2"); 
    static_assert(sd1.time_since_epoch().count() == 17177, "sd1 is day 17177"); 
    static_assert(sd1 == 2017_y/jan/11, "sd1 is 2017-01-11"); 
} 

constexpr/static_assert requir完全準拠のC++ 14コンパイラです。 C++ 11の場合は、constexprを削除し、static_assertassertに変更してください(そしてstatic_assertメッセージを削除してください)。

date::sys_dayschrono::time_pointのtypedefである:

time_point<system_clock, duration<int, ratio<86400>> 

上記の例のコードのみ"date.h"を必要とせず、他のC++ソースファイル(NOインストール)。 timezone library at this same github locationもありますが、インストールする必要があります。


私はこのライブラリの主な著者です。あなたが記述するものについては

+0

それは非常に良いとしょうかん。あなたが書いたことを明示的に開示せずに、あなた自身の図書館を「非常に良い図書館」として紹介しているように感じているかどうかはわかりません。 –

+0

多くの人が時間がたつにつれて寄与しています:https://github.com/HowardHinnant/date/graphs/contributors :-)私はそれを自分で持ち運びができないでしょう。はい、私は主な著者です。 James Beachは昨日それをVS-2017に移植しました。 –

+0

あなたの答えの最初の文章を微妙に微調整してもいいかもしれません:) –

1

、標準のCスタイルのルーチンは、おそらく最高の仕事に行くされています。ここではhttp://en.cppreference.com/w/cpp/chrono/c

これは標準であり、至る所で動作します

#include <ctime> 

const int SECONDS_PER_DAY = 24 * 60 * 60; 

tm day1; 
memset(&day1, 0, sizeof(day1)); 
day1.tm_year = 2016 - 1900; // tm_year is the years since 1900 
          // so to represent 2016, the value is 116. 
day1.tm_mon = 0; 
day1.tm_mday = 20; 

time_t day1a = mktime(&day1); 

tm day2; 
memset(&day2, 0, sizeof(day2)); 
day1.tm_year = 2008 - 1900; 
day1.tm_mon = 0; 
day1.tm_mday = 20; 

time_t day2a = mktime(&day2); 

double day_delta = difftime(day1, day2); // returns number of seconds 
double days_past = (day_delta/SECONDS_PER_DAY) 

コーディングCスタイルを使用してラフな例です。 。

N.B.POSIX標準ではtime_tが整数型として定義されています

+0

これは最近私のチームでコードレビューに合格していない可能性があります。また、私が知っている限り、うるう秒を考慮していません(ただし、他の人間のタイミングの不思議さを認識する必要があります)。 –

+0

私はコードレビューにも合格しません。私が言ったように、それは一般的な使い方を示し、彼を 'tm'、' mktime() '、' time_t'などに紹介するのは大まかな例です。彼は経過日数を尋ねている。私は彼がそれを数秒で測ることを気にかけているとは思っていないので、うるう秒はそれに遊びません。 –

+0

それは86400の後になります^ _ ^私はあなたが自分の仕事で拒否する解決策を推薦する答えを書いた理由について興味があります。まぁ。 –

1

自分で実装する必要がある場合は、最も簡単な方法は日付を単一の整数として保持することです - Julian day記事の計算ではJulian dayバックはかなり些細なことです(コンピュータの観点から)。日付を1つの数字にしておくと、日数の差を計算したり比較したりするのは簡単です。または、それが既に構造体として実装されていると言う場合、あなたはその日のユリウス日に日付を変換することができます(またはその値をキャッシュするために変更可能なフィールドを保持します)。