#27095: C/C++ tm, mktime解法


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.12.66.21]
最後登入時間 :
2025-04-20 17:19:22

看了一下解題報告,似乎沒有人提到這個方法,如果你懶得手動計算日期,C語言有個結構叫做tm,可以像這樣用:

        struct tm tm1={0};
        tm1.tm_year=year-1900;
        tm1.tm_mon=month-1;
        tm1.tm_mday=day;

然後用mktime(&tm1)就能得到秒數。兩個秒數相減除86400就是日期差異

#27101: Re:C/C++ tm, mktime解法


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16

看了一下解題報告,似乎沒有人提到這個方法,如果你懶得手動計算日期,C語言有個結構叫做tm,可以像這樣用:

        struct tm tm1={0};
        tm1.tm_year=year-1900;
        tm1.tm_mon=month-1;
        tm1.tm_mday=day;

 

然後用mktime(&tm1)就能得到秒數。兩個秒數相減除86400就是日期差異


我有查到資料,酷耶!

https://www.cplusplus.com/reference/ctime/tm/

https://www.cplusplus.com/reference/ctime/mktime/

 

想請問為什麼直接秒數相減就可以是答案了呢?秒數的range只有0-60為何可以這樣操作?

#27104: Re:C/C++ tm, mktime解法


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.12.66.21]
最後登入時間 :
2025-04-20 17:19:22

看了一下解題報告,似乎沒有人提到這個方法,如果你懶得手動計算日期,C語言有個結構叫做tm,可以像這樣用:

        struct tm tm1={0};
        tm1.tm_year=year-1900;
        tm1.tm_mon=month-1;
        tm1.tm_mday=day;

 

然後用mktime(&tm1)就能得到秒數。兩個秒數相減除86400就是日期差異


我有查到資料,酷耶!

https://www.cplusplus.com/reference/ctime/tm/

https://www.cplusplus.com/reference/ctime/mktime/

 

想請問為什麼直接秒數相減就可以是答案了呢?秒數的range只有0-60為何可以這樣操作?


我沒有說清楚,這裡的秒數指的是從1970年1月1日零點開始的秒數

https://www.cplusplus.com/reference/ctime/time_t/

#29806: Re:C/C++ tm, mktime解法


alex950301 (alex0301)

學校 : 新北市立新莊高級中學
編號 : 141423
來源 : [140.117.194.239]
最後登入時間 :
2025-10-01 22:51:46

 

        tm1.tm_mon=month-1;
 


可以問一下為什麼要減掉1阿

 

#29807: Re:C/C++ tm, mktime解法


alex950301 (alex0301)

學校 : 新北市立新莊高級中學
編號 : 141423
來源 : [140.117.194.239]
最後登入時間 :
2025-10-01 22:51:46

 

        tm1.tm_mon=month-1;
 


可以問一下為什麼要減掉1阿

 

 


算進去最後相差的量還是定值 會有誤差嗎

 

#29810: Re:C/C++ tm, mktime解法


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.12.66.21]
最後登入時間 :
2025-04-20 17:19:22

 

        tm1.tm_mon=month-1;
 


可以問一下為什麼要減掉1阿

 

 


算進去最後相差的量還是定值 會有誤差嗎

 


減1是因為月分是從0開始算

第二句話看不懂你的意思

#29985: Re:C/C++ tm, mktime解法


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.12.66.21]
最後登入時間 :
2025-04-20 17:19:22

看了一下解題報告,似乎沒有人提到這個方法,如果你懶得手動計算日期,C語言有個結構叫做tm,可以像這樣用:

        struct tm tm1={0};
        tm1.tm_year=year-1900;
        tm1.tm_mon=month-1;
        tm1.tm_mday=day;

 

然後用mktime(&tm1)就能得到秒數。兩個秒數相減除86400就是日期差異


有人詢問之後我才發現,如果年份在1970年之前,有些系統的函式庫會出現錯誤,似乎是因為c/c++標準只規定1970年之後的時間,雖然glibc支援我這種寫法,但是這是非標準的寫法。會介意的話就不要像我這樣寫。