2016-09-28 9 views
0

特定の日付から現在の日付までの日数を取得したいとします。 ここは、1970年1月1日からの日数を取得する現在のコードです。日付と現在の間の日数をtime()関数を使用して取得する

int days_since_my_birth(int day, int month, int year) { 

    time_t sec; 
    sec = time(NULL); 

    printf("Number of days since birth is %ld \n", sec/86400); 

    return d; 
} 

は私が入力した日付からの秒数を取得するにはtime()機能を使用することはできますか?

+0

1)誕生日を 'mktime()'で 'time_t'に変換します。 (1970年1月1日より前に生まれた場合は問題があるかもしれません)2) 'time()'で現在時刻を取得する3) 'difftime()'で秒差を取得し、(60 * 60 * 24)で割ります。 – chux

+1

'man mktime'、' man difftime'。 *更新*:OK、@chuxが勝利... –

+0

なぜ「「生年月日」を目標にしているのか? – chux

答えて

0

ここで最後にやった方法です。入力された誕生日が1970年以前であれば動作しません。すべての助けに感謝します。

私はちょうどそれを行うより効率的な方法があるので、Cを学び始めたばかりです。

int days_since_my_birth(int day, int month, int year) { 

    //create a time struct and initailize it with the function parameters 
    struct tm time_info = { 0 }; 
    time_info.tm_year = year - 1900; 
    time_info.tm_mon = month -1; 
    time_info.tm_mday = day; 

    //get the number of seconds from 1970 
    int n = time(NULL); 

    // convert the birthdate to seconds 
    double birthday = mktime(&time_info); 
    // convert the birthdate to days 
    birthday = (birthday/86400); 
    //get the no of days alive by subtracting birthdate days 
    int result = (n/86400) - birthday; 

    return result; 

} 
+0

この解決策は、1) 'mktime()'入力がタイムゾーンに敏感ですが、結果はタイムゾーンデータを破棄し、2) 'double'から' int'を0に切り捨てるため、 '(n/86400) - birthday'計算。 printf( "%d \ n"、days_since_my_birth(2、10、2016))のように、今日の日付でこの関数を試してみてください。 printf( "%d \ n"、days_since_my_birth(3、10、2016)); printf( "%d \ n"、days_since_my_birth(4,10,2016)); '2つまたは3つの差分結果が得られるかどうかを確認します。 _your_timezoneに応じて、深夜(深夜UTC)の前後にこれを試して、他の問題を確認してください。 – chux

0

後日のジュリアン整数から前の日付のジュリアン日整数を引きます。以下は、それを行う方法を正確に示しています。

http://www.cs.utsa.edu/~cs1063/projects/Spring2011/Project1/jdn-explanation.html

そうでない場合は、http://pdc.ro.nu/jd-code.htmlはすでにCのバージョンを持っている

long gregorian_calendar_to_jd(int y, int m, int d) 
{ 
    y+=8000; 
    if(m<3) { y--; m+=12; } 
    return (y*365) +(y/4) -(y/100) +(y/400) -1200820 
      +(m*153+3)/5-92 
      +d-1; 
} 
0

取得した日付間の日数、今の時間を使って()関数

#include <math.h> 
#include <time.h> 
int days_since_my_birth(int day, int month, int year, double *days) { 

    struct tm birthdate = { 0 }; // set all fields to 0 
    birthdate.tm_year = year - 1900; 
    birthdate.tm_mon = month - 1; // Months since January 
    birthdate.tm_mday = day; 
    birthdate.tm_isdst = -1; // Let system determine if DST was in effect 

    // Form timestamp for the birthdate. 
    time_t birth_time = mktime(&birthdate); 
    if (birth_time == -1) return FAIL; 

    time_t now; 
    if (time(&now) == -1) return FAIL; 

    // Calculate difference in seconds and convert to days. 
    // Round as desired (rint(), floor(), etc.) 
    *days = floor(difftime(now, birth_time)/86400); 
    return SUCCESS; 
} 

使ってもいいですか入力した日付から秒数を取得するtime()関数?

多分、time(NULL)は、秒でも1970年1月1日のような特定のエポックからも指定されていません。

difftime()は秒単位で戻り値を返します。

+0

あなたのコードを実行しようとしているときにimが例外になってしまった。私はそれを自分自身でやる方法を見つけ出すことができた。私はあなたが*日を関数のパラメータとして持ち、ローカル変数として宣言されていない理由を尋ねることができますか? – Swannie

+0

@Swannie '* days'は、生きている日の値を返すために使用されます。この関数の戻り値は、成功または失敗を示します。 「例外の取得」に関して、関数をどのように呼び出すのですか? 'double dのように。 if(days_since_my_birth(3、10、2016、&d)==成功)printf( "%f \ n"、d); '? – chux

関連する問題