⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datetime.c

📁 T-kernel 的extension源代码
💻 C
字号:
/* *---------------------------------------------------------------------- *    T-Kernel / Standard Extension * *    Copyright (C) 2006 by Ken Sakamura. All rights reserved. *    T-Kernel / Standard Extension is distributed  *      under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * *    Version:   1.00.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* *	datetime.c (libg) * *	System time STIME *	Unit		sec *	Reference time/date	1/1/1985 00:00:00 *	No. of valid years	To 2053 or so *	No. of valid seconds	0x00000000  -  0x7fffffff *	To allow for time correction based on TIMEZONE, the range of STIME shown below *	includes the previous and following days: *	0x00000000-24*60*60  -  0x7fffffff+24*60*60 * *	Within the valid range of system time, a leap year simply comes once every four years. *	(Year 2000 is a leap year.) * *	   January 1985 *	 S  M Tu  W Th  F  S *	       1  2  3  4  5 *	 6  7  8  9 10 11 12 *	13 14 15 16 17 18 19 *	20 21 22 23 24 25 26 *	27 28 29 30 31 */#include <basic.h>#include <extension/datetime.h>#include <libstr.h>#include <stdlib.h>#include <sys/util.h>/* Number of days in four years */#define	FourYear	( 365 + 365 + 365 + 366 )/* Number of days in each month (except for leap year) */LOCAL const H	Days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };/* Day of week (Count days starting on 1/1/1985) */#define	weekday(day)	( ((day) + 2) % 7 )/* * Conversion from calendar date to total number of seconds *	Convertible from 12/31/1984 00:00:00 onward *	The result is undefined outside the convertible range or in case of parameter error. */EXPORT void DATEtoTIME( STIME *time, DATE_TIM *date ){	div_t	d;	STIME	t;	W	day, i;	if (( date->d_year == 84 )	  && ( ((date->d_month ==  0 )&&( date->d_days == 366))	    || ((date->d_month == 12 )&&( date->d_day  ==  31)) ) ) {		/* December 31, 1984 */		t = date->d_hour;		t = (t * 60) + date->d_min;		t = (t * 60) + date->d_sec;		*time = t - (24*60*60);		return;	}	d = div(date->d_year - 85, 4);	day = d.quot * FourYear + d.rem * 365;		/* year -> day */	if ( date->d_month == 0 ) {		day += date->d_days - 1;	} else {		for ( i = date->d_month - 2; i >= 0; i-- ) {			if (( i == 1 )&&( d.rem == 3 )) {				/* February in a leap year */				day += 29;			} else {				day += Days[i];			}		}		day += date->d_day - 1;	}	t = (day * 24) + date->d_hour;			/* day -> hour */	t = (t * 60) + date->d_min;			/* hour -> minute */	t = (W)(((UW)t * 60U) + (UW)date->d_sec);	/* minute -> second */	*time = t;}/* * Conversion from total number of seconds to calendar date *	Valid range of time: 0x00000000-24*60*60  -  0x7fffffff+24*60*60 *	The result is undefined outside the valid range. */EXPORT void TIMEtoDATE( DATE_TIM *date, STIME time ){	div_t	d;	W	day, i;	if (( time < 0 )&&( time >= -24*60*60 )) {		/* December 31, 1984 */		d = div(time + (24*60*60), 60);		date->d_sec   = d.rem;		d = div(d.quot, 60);		date->d_min   = d.rem;		date->d_hour  = d.quot;		date->d_year  = 84;		date->d_month = 12;		date->d_day   = 31;		date->d_week  = 53;		date->d_wday  = 1;		date->d_days  = 366;		return;	}	date->d_sec = (W)((UW)time % 60U);		/* Second */	d = div((W)((UW)time / 60U), 60);	date->d_min = d.rem;				/* Minute */	d = div(d.quot, 24);	date->d_hour = d.rem;				/* Hour */	day = d.quot;					/* Total number of days */	date->d_wday = weekday(day);			/* Day of week */	d = div(day, FourYear);	date->d_year = 85 + (d.quot * 4);	d = div(d.rem, 365);	if ( d.quot > 3 ) {		d.quot--;		d.rem += 365;	}	date->d_year += d.quot;				/* Year */	date->d_days = d.rem + 1;			/* Number of days */	i = weekday(day - d.rem);			/* Day of week on Jan. 1 of that year */	date->d_week = ((d.rem + i) / 7) + 1;		/* Week */	day = d.rem;	for ( i = 0; i < 12; i++ ) {		if (( i == 1 )&&( d.quot == 3 )) {			/* February in a leap year */			if ( day < 29 ) {				break;			}			day -= 29;		} else {			if ( day < Days[i] ) {				break;			}			day -= Days[i];		}	}	date->d_month = i + 1;				/* Month */	date->d_day = day + 1;				/* Day */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -