回文章列表
作者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       
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻