<轉錄/Local Save> 三篇關於 date_stamp 實作

作者: Dopin (ats.twbbs.org)   2010-01-12 12:56:28
轉錄到這之後附註說明 :
(1) 因為文章不見 有人寫信予我這裡看比較方便 ... (其實我覺得到出處看就好 ...)
(2) 以往 我們都是用 time_t now = time(NULL); 取得 timestamp 後用 ctime() 去
秀出 YYYY MM DD hh rr ss (格式看用那個函式 也有自訂函式) 可是我們無法用
YYYY MM DD (本程式以 day 為基準省略 hh mm <即只以第一天的第 0 小時 0 分
為算出值 本程式 當然 可擴充 再輸入 時(hh) 分(mm) 秒(ss)> 於此略之)
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now = time(NULL);
printf("%d\n%s\n", (int)now, ctime(&now));
return 0;
}
我們如果得到一個 stamp 值 1263225600 代入 ctime() 即可顯示我們所知的時制 :
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now = 1263225600;
printf("%s\n", ctime(&now));
return 0;
}
會得到這樣的結果 :
Tue Jan 12 00:00:00 2010
我們要算 2010/01/15 00:00:00 的 timestamp 怎算 ? 很簡單 把 2010/01/12 的
timestamp 加上 86400x3 即可 加減都可以比照
但是 ...
那 我們有沒有辦法輸入 2010 01 12 然後得到 stamp 值呢 ? 很遺憾的 在 ANSI-C
中 並沒有 這樣的東西
有人或許會問了 要這種東西做啥 ?
最簡單的問題應用 -> 求 A B 兩時間點差了多久
"民國 96 年 11 月 16 日" 跟 "民國 85 年 11 月 16 日" 差了幾天 ?
這問題很單純 他們差了11 年 那 11 年是差幾天 ? 365x11 ? 不是吧 ... 原因很
簡單 閏年問題 所以我們計算時要加上 '中間經過幾個閏年'
好 這可能還是個簡單的問題 那麼來點比較長的時間
"民國 97 年 03 月 02 日" 跟 "民國 68 年 05 月 16 日" 差了幾天 ?
算出 多一年的 3/02 跟 5/16 差幾天 再乘以不足年數 x365 天 再加閏年有幾個
很好 如果每個日期都這樣比對 即時運算會很 ... 我想大家知道我的意思 ...
又有人會說 阿就 difftime() 套下去就好啦 ? 可是 ... 有這麼簡單嗎 ?
來看原式宣告 double difftime(time_t time1, time_t time0);
time_t 可是 integer 喔 可不是啥 [CC]YY/MM/DD 這麼單純 如我有這種東西我
也想用 (其實 有個秘密 ... 懂 本程式 你可以自己寫一個
int diff_date(char *date1, char *date2); // date 1/2 as yyyy/mm/dd
到時就可這樣叫用 diff_date("2009/12/18", "1997/12/19");
(這兩個日期的梗相信鄉民知道 :p)
簡而言之 沒有真的實作過人的不會知道 "沒有可用函式" 的心酸 :p
所以 我這篇文章其實是把行之有年的東東 公開 來 !!!
如果 還不知道這個函式有 ~多麼好用~ 看倌們就當作是看看小學數學習題亦可 :)
X X X
作者 Dopin (系統調校完成) 看板 InstallBBS
標題 <轉錄> 受不了 ...
時間 Wed Dec 16 23:16:06 2009
───────────────────────────────────────
※ [本文轉錄自 ATSVersion 看板]
作者: Dopin (系統調校完成) 看板: ATSVersion
標題: 受不了 ...
時間: Wed Dec 16 06:17:21 2009
想說要把自動連署寫的更完備些 舊程式遇到跨年就死了 - -;;; 所以我想找個能把
yyyy/dd/mm 轉成 timestamp 的程式 這樣純數值減法問題會少很多 不用啥比月份
大小完再比日期 遇到年份不同再比 ... 囉唆的要命 Orz
我依稀這玩意兒國中還高中讀書時代寫過 (那時是賺外快幫個漫畫店寫 Clipper 遇
到沒有 yyyymmdd 的好用解 而 DBASE 內建的東西又爛的要死 所以 "開發的" (扛
成 .obj 拿來 link 用 Orz)
不幸的是以前的實作法真的給他忘記了 ... 我只記得有用到 difftime() 之類函式
(也許有記錯 我記得是 Turbo C 下寫的) 但實在想不起來程式片段的詳細到底是怎
樣 而且那時就愛耍帥 喜歡把程式寫的讓人看不懂 最後 ... 看不懂的往往是自己
(還喜歡在 C 裡 inline ASM - -;;;)
人懶 沒藥醫 上網找有沒有現成的函式可以用 (不要臉 :p)
但是 !!! 找半天沒找著 (怒) 只找到個網站有類似討論的 :
http://www.lslnet.com/linux/f/docs1/i41/big5291280.htm
(再次強調 我是要找 ANSI-C 的解法) 但是進去看發現不是寫的亂七八糟 就是根本
寫錯 而且 還有人居然對其他討論者這樣寫道 :
"特大喜訊,我給你發了. 公司機密文件,僅限站內朋友,請勿外傳,謝謝."
或是什麼 "不過不要敲我的飯碗啊." "收到,謝謝,不敢外傳!" 都可以說 ...
我的天 這又不是啥偉大或獨門的演算法 :p
不過熱心助人是不能否定的 能用當然是歡樂 ^OO^ 無奈 ... 略 "喵" 了該網頁的範
例 兩個都寫的亂七八糟(第三個只是把時間函式列出來 <核爆>) 看到那種縮排 我自
己搞都比較快 所以啦 就這樣辦 = =b (GOGOGOGO !!!)
說嘴 : 下面那篇文章的程式 "完全不是" 啥了不起的東西 不過要是拿去用可要說
這是 Dopin 的解法 (再次不要臉 XD ... 冷掉了)

Links booklink

Contact Us: admin [ a t ] ucptt.com