簡體   English   中英

計算兩個不同日期兩次的差

[英]Calculate the difference between two times on two different days

我試圖確定兩次之間的時間差,我將其表示為無符號整數(以sturct表示),如下所示:

unsigned int day;
unsigned int month;
unsigned int year;

unsigned int hour;
unsigned int mins;
unsigned int seconds;

我可以使用以下方法很容易地計算出同一天發生的兩次之間的時間差(以分鍾為單位):這不是我的確切代碼,這只是其背后的邏輯。

time1 = hours*3600 + mins*60 +  seconds;
time1 = hours2*3600 + mins2*60 +  seconds2;

    //time2 will always be less than time1

    time_diff_secs = time1_secs - time2_secs;
    time_diff_mins = time_diff_secs / 60;
    time_diff_secs = time_diff_secs % 60;

這將產生以下輸出:

Time mayday was issued: 13 Hours 4 Mins 0 Seconds 
Time mayday was recieved: 13 Hours 10 Mins 0 Seconds 
Time between sending and receiving:  6.00Mins

這是正確的,但是當我在不同的日子有兩次時,得到的結果是:

Time mayday was issued: 23 Hours 0 Mins 0 Seconds 
Time mayday was recieved: 0 Hours 39 Mins 38 Seconds 
Time between sending and receiving: 71581448.00Mins 

這顯然是不正確的,我不確定從這里開始如何進行,實際結果應該是40分鍾,而不是7150萬。

使用標准C庫執行此操作的另一種方法,此方法的唯一優點是您不必擔心日期重疊的年份,也不必擔心月份邊界重疊的問題+ s年廢話:

unsigned int day;
unsigned int month;
unsigned int year;

unsigned int hour;
unsigned int mins;
unsigned int seconds;


time_t conv(void)
{
   time_t retval=0;
   struct tm tm;
   tm.tm_mday=day;
   tm.tm_mon=month -1;
   tm.tm_year=year - 1900;
   tm.tm_hour=hour;
   tm.tm_min=mins;
   tm.tm_sec=seconds;
   tm.tm_isdst=-1;
   retval=mktime(&tm);
   return retval;
}

int main()
{
   time_t start=0;
   time_t end=0;
   time_t diff=0;
   // assign day, month, year ... for date1
   start=conv();
   // assign day, month, year ... for date2
   end=conv();
   if(start>end)
     diff=start - end;
   else
     diff=end - start;
   printf("seconds difference = %ld\n", diff);
   return 0; 
}

您正在下溢。 試試看(不管變量是帶signed還是unsigned ):

if (time1_secs < time2_secs) {
    // New day. Add 24 hours:
    time_diff_secs = 24*60*60 + time1_secs - time2_secs;
} else {
    time_diff_secs = time1_secs - time2_secs;
}

time_diff_mins = time_diff_secs / 60;
time_diff_secs = time_diff_secs % 60;

更改

time_diff_secs = time1_secs - time2_secs;

time_diff_secs = abs(time1_secs - time2_secs) % 86400;

這將迫使它成為兩個時間之間的最小時間差,並且即使在time_diff_secs計算中增加了天,月等也將time_diff_secs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM