2016-09-14 10 views
0

2つのdatetime(年、月、日、時、分、秒)の差を計算できる関数が必要です。その差異を同じ形式で返すことができます。ここCでdatetimeの差を計算する

int main(){ 

    struct datetime dt_from; 
    init_datetime(&dt_from, 1995, 9, 15, 10, 40, 15); 

    struct datetime dt_to; 
    init_datetime(&dt_to, 2004, 6, 15, 10, 40, 20); 

    struct datetime dt_res; 

    datetime_diff(&dt_from, &dt_to, &dt_res); 

    return 0; 

} 

void datetime_diff(struct datetime *dt_from, struct datetime *dt_to 
, struct datetime *dt_res) { 

    //What can I do here to calculate the difference, and get it in the dt_res? 

} 
+5

あなたが標準のようなものを意味する[ 'difftime'](HTTP ://en.cppreference.com/w/c/chrono/difftime)function? –

+0

struct datetimeは移植性がありません。 "time.h"ライブラリを使うべきですので、struct tm – jurhas

+0

を使用してください。1) 'struct datetime'の定義をポストしてください。 2) 'init_datetime()()'の定義を定義します。3)オーバーフローをコードがどのように扱うべきかを記述すると便利です。 – chux

答えて

0

は基本的な考え方である:

あなたdatetimeは、最小単位(あなたの場合の第2)だとしてあなたdatetime値を表す整数型(好ましいlong long又はunsigned long long)に変換します。それを達成する方法?単一の値を簡単に秒に変換し、すべてを一緒に追加します。 (seconds + minutes * 60 + hours * 3600 ...

これを両方の値に対して行い、次に整数値を減算します。

ここで、単一の整数値、時差をdatetimeに変換し直してください。どうやって?最大の単位(年)から始めて、その差を1年以内の秒数で割る(60 * 60 * 24 * 365)。今度はあなたの2つの間に何年があるか知っているdatetime。休息を取り、月あたりの秒数で割り、など...


(もちろん、私は、例えば夏時間のように、かなり複雑にすべてを無視)しかし、私は非常だろうコメントに記載されている通りtime.hからstruct tmを使用することをお勧めします。ポータブルで、difftimeを使用できます。

0

time.hを使用するこの例を試してみてください。ポータブルである必要があります。あなたの質問の日付間の日数の差を計算します。あなたは、あなたが望むように動作するように、プログラムを少し変更することができます。

#include <stdio.h> 
#include <time.h> 
#include <math.h> 

int main() { 
    time_t start_daylight, start_standard, end_daylight, end_standard;; 
    struct tm start_date = {0}; 
    struct tm end_date = {0}; 
    double diff; 

    printf("Start date: "); 
    scanf("%d %d %d", &start_date.tm_mday, &start_date.tm_mon, &start_date.tm_year); 
    printf("End date: "); 
    scanf("%d %d %d", &end_date.tm_mday, &end_date.tm_mon, &end_date.tm_year); 

    /* first with standard time */ 
    start_date.tm_isdst = 0; 
    end_date.tm_isdst = 0; 
    start_standard = mktime(&start_date); 
    end_standard = mktime(&end_date); 
    diff = difftime(end_standard, start_standard); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    /* now with daylight time */ 
    start_date.tm_isdst = 1; 
    end_date.tm_isdst = 1; 
    start_daylight = mktime(&start_date); 
    end_daylight = mktime(&end_date); 
    diff = difftime(end_daylight, start_daylight); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    return 0; 
} 

テスト

Start date: 15 9 1995 
End date: 15 6 2004 
3195 days difference 

、あるいは単純な非対話型コードの標準または夏時間を持つ:

#include <stdio.h> 
#include <time.h> 
#include <math.h> 
int main() 
{ 
    time_t start_daylight, start_standard, end_daylight, end_standard;; 
    struct tm start_date = {0}; 
    struct tm end_date = {0}; 
    double diff; 

    start_date.tm_year = 1995; 
    start_date.tm_mon = 9; 
    start_date.tm_mday = 15; 
    start_date.tm_hour = 10; 
    start_date.tm_min = 40; 
    start_date.tm_sec = 15; 

    end_date.tm_mday = 15; 
    end_date.tm_mon = 6; 
    end_date.tm_year = 2004; 
    end_date.tm_hour = 10; 
    end_date.tm_min = 40; 
    end_date.tm_sec = 20; 

    /* first with standard time */ 
    start_date.tm_isdst = 0; 
    end_date.tm_isdst = 0; 
    start_standard = mktime(&start_date); 
    end_standard = mktime(&end_date); 
    diff = difftime(end_standard, start_standard); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    /* now with daylight time */ 
    start_date.tm_isdst = 1; 
    end_date.tm_isdst = 1; 
    start_daylight = mktime(&start_date); 
    end_daylight = mktime(&end_date); 
    diff = difftime(end_daylight, start_daylight); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    return 0; 
} 
+1

あなたのコードは、無効なユーザー入力で未定義の動作をしています。これは一般的に、人々がコピーする可能性のあるサンプルコードの中では悪いことです。 – hyde

+0

@hydeエラーチェックを追加する必要がありますか? –

+1

'mktime()'は、 'tm_yday、tm_wday'を除く' struct tm'のすべてのフィールドを読み込みます。このコードでは、6つしか設定されていません。すべてのフィールドを設定して 'tm_isdst'を調べるには、' struct tm start_date = {0}; 'で初期化することを提案してください。 – chux