線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2783
推到 Plurk!
推到 Facebook!

日期計算:某日是星期幾、幾天前/後是什麼日期

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-25 19:29:15 IP:61.218.xxx.xxx 未訂閱

日期計算:某日是星期幾、幾天前/後是什麼日期

作者: 黑山老妖 www.ccrun.com #include < stdio.h > #include < time.h > #include < string.h > typedef enum {Error_ = -1, Success_, False_ = 0, True_} Boolean_T; typedef unsigned int USGI; typedef unsigned long USGL; #ifndef ISO_CAL #define ISO_CAL 0 #endif #if ISO_CAL /* monday == 0 */ #define ADJ 5 #else /* sunday == 0 */ #define ADJ 6 #endif static long jan1date; /* ---------------------------------------------------------------------- */ int isleap (USGI yr) { return yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0); } /* ---------------------------------------------------------------------- */ static USGI months_to_days (USGI month) { return (month * 3057 - 3007) / 100; } /* ---------------------------------------------------------------------- */ static long years_to_days (USGI yr) { return yr * 365L yr / 4 - yr / 100 yr / 400; } /* ---------------------------------------------------------------------- */ long ymd_to_scalar (USGI yr, USGI mo, USGI day) { long scalar; scalar = day months_to_days(mo); if ( mo > 2 ) /* adjust if past February */ scalar -= isleap(yr) ? 1 : 2; yr--; scalar = years_to_days(yr); return scalar; } /* ---------------------------------------------------------------------- */ void scalar_to_ymd (long scalar, USGI *yr, USGI *mo, USGI *day) { USGI n; /* compute inverse of years_to_days() */ for ( n = (USGI)((scalar * 400L) / 146097L); years_to_days(n) < scalar;) n ; /* 146097 == years_to_days(400) */ *yr = n; n = (USGI)(scalar - years_to_days(n-1)); if ( n > 59 ) { /* adjust if past February */ n = 2; if ( isleap(*yr) ) n -= n > 62 ? 1 : 2; } *mo = (n * 100 3007) / 3057; /* inverse of months_to_days() */ *day = n - months_to_days(*mo); } /* ---------------------------------------------------------------------- */ Boolean_T valiDate(USGI yr, USGI mo, USGI day) /*** Determine if a given date is valid */ { USGI days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (1 > mo || 12 < mo) return False_; if (1 > day || day > (days[mo - 1] (2 == mo && isleap(yr)))) return False_; else return True_; } /* ---------------------------------------------------------------------- */ USGI dow(USGI yr, USGI mo, USGI day) /*** Return the day of the week*/ { #if (!ISO_CAL) /* Sunday(0) -> Saturday(6) (i.e. U.S.) calendars */ return (USGI)(ymd_to_scalar(yr, mo, day) % 7L); #else /* International Monday(0) -> Sunday(6) calendars */ return (USGI)((ymd_to_scalar(yr, mo, day) - 1L) % 7L); #endif } /* ---------------------------------------------------------------------- */ USGI DOW(USGI y, USGI m, USGI d) { if (m < 3) { m = 13; y--; } else m ; return (d 26 * m / 10 y y / 4 - y / 100 y / 400 ADJ) % 7; } /* ---------------------------------------------------------------------- */ int daynum(int year, int month, int day) /*** Return the day of the year (1 - 365/6)*/ { jan1date = ymd_to_scalar(year, 1, 1); return (int)(ymd_to_scalar(year, month, day) - jan1date 1L); } /* ---------------------------------------------------------------------- */ int weeknum(int year, int month, int day) /*** Return the week of the year (1 - 52, 0 - 52 if ISO)*/ { int wn, j1n, dn = daynum(year, month, day); dn = (j1n = (int)((jan1date - (long)ISO_CAL) % 7L)) - 1; wn = dn / 7; if (ISO_CAL) wn = (j1n < 4); else wn; return wn; } /* ---------------------------------------------------------------------- */ USGI moonphase(USGI yr, USGI mo, USGI dy) { USGL date = (USGL)ymd_to_scalar(yr, mo, dy); date *= 9693L; date /= 35780L; date -= 4L; date %= 8L; return (USGI)date; } /* ---------------------------------------------------------------------- */ long today(void) { time_t tnow; struct tm *tmnow; time(&tnow); tmnow = localtime(&tnow); return ymd_to_scalar(tmnow->tm_year 1900, tmnow->tm_mon 1, tmnow->tm_mday); } /* ---------------------------------------------------------------------- */ int main(int argc, char **argv) { int year, mon, day, after; if(argc == 5) { year = atoi(argv[1]); mon = atoi(argv[2]); day = atoi(argv[3]); after = atoi(argv[4]); if(year < 1000) year = 1900; if(!valiDate(year, mon, day)) { printf("Invalid date!\n"); return 1; } printf("DOW of %d/%d/%d is %d, ", year, mon, day, dow(year, mon, day)); printf("moonphase is %d, %d/%d/%d % d = ", moonphase(year, mon, day), year, mon, day, after); scalar_to_ymd (ymd_to_scalar(year, mon, day) after, &year, &mon, &day); printf("%d/%d/%d\n", year, mon, day); } else printf("Return day of week of a given date and what date before" " or after some days\n" "e.g.: %s 2000 4 26 1 -> 3, 6, 2000/4/27\n" " %s 2000 4 26 -1 -> 3, 6, 2000/4/25\n", argv[0], argv[0]); return 0; } [/code] 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
系統時間:2024-05-05 7:51:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!