<转录/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