作者Dopin.bbs@bbs.bsd.com.tw (系統調校完成) 看板: installbbs
標題<轉錄> src/maple/date_stamp.c (拿到 maple/ 下扛最快 …
時間亞特蘭提斯 (2009/12/16 Wed 23:58:19)
※ [本文轉錄自 ATSVersion 看板]
作者: Dopin (系統調校完成) 看板: ATSVersion
標題: src/maple/date_stamp.c (拿到 maple/ 下扛最快 :p)
時間: Wed Dec 16 06:26:15 2009
/*-------------------------------------------------------*/
/* date_stamp.c ( Atlantis BBS Ver 1.32 ) */
/*-------------------------------------------------------*/
/* target : 將 yyyy mm dd 的引數轉換成 time stamp */
/* create : 2009/12/16 (Dopin) */
/* update : / / */
/*-------------------------------------------------------*/
/* syntex : date_stamp <yyyy> <mm> <dd> */
/*-------------------------------------------------------*/
#include "bbs.h"
// ats 1.32 append 小學例題 計算閏年 我還故意用很 "易懂" 的回傳法 :p
int check_bissextile(int y) {
/* 逢 四年 閏 逢 百年 不閏 逢 百年 且 逢 四百年 又閏 */
return !(y % 4) && ((y % 100) || !(y % 100) && !(y % 400)) ;
}
// ats 1.32 append 小學例題 判定年月日是否合理 本程式不考慮 1970 年前
// 也缺乏詳細的每月檢查(只查閏月)有需要嚴格檢查自己改
int chack_yyyymmdd(int y, int m, int d) {
if(y < 1970) return -1;
if(m > 12 || m < 1) return -2;
if(d > 31 || d < 1) return -3;
if(m == 2 &&
(check_bissextile(y) && d > 29 || !check_bissextile(y) && d > 28))
return -4;
return 0;
}
// ats 1.32 append 計算 yyyymmdd 的 timestamp 究極土法鍊鋼 才是王道 (挺)
int yyyymmdd_to_stamp(int y, int m, int d) {
char day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 0 };
int i, days = 0; /* 沒人需要 12 月 除非整年要從一加到十二月 ! */
// 加到前一年
for(i = 1970 ; i < y ; i++) days += check_bissextile(i) ? 366 : 365;
// 加到前一月
for(i = 1 ; i < m ; i++) days += day[i - 1];
// 加到當天
days += d;
// 該年為閏年且超過 二月 (因為閏月格式先前已檢查過) 加一天
if(check_bissextile(y) && m > 2) days += 1;
// 多減一天的原因是 1970 年的 1 月 1 號 是 0 所以含了當天會 "多算一天"
// 多減 8 小時的原因是因為我們用 GMT 跟 CST 差八小時 隨時區不同要調整
return days * 86400 - 86400 - 8 * 3600 ;
}
/* 以上的函式 我會加到之後的 dopin.c / dopin.h 之中 這程式沒有 Y2K 問題 */
int main(int argc, char *argv[]) {
int y, m, d, error;
time_t stamp;
if(argc != 4) {
puts("syntex: date_stamp <yyyy> <mm> <dd>");
return -1;
}
y = atoi(argv[1]);
m = atoi(argv[2]);
d = atoi(argv[3]);
if(error = chack_yyyymmdd(y, m, d)) {
printf("date error ! Code : %d\n", error);
return -2;
}
stamp = (time_t)yyyymmdd_to_stamp(y, m, d);
printf("[ %d ]\n", (int)stamp);
/* 這行純驗證用 覺得不需要就可以拿掉他 */
printf("%s", ctime(&stamp));
return 0;
}
--
Origin: Atlantis DN: bbs.bsd.com.tw IP : 203.70.65.27 ST: atlantis